mirror of https://gitee.com/openkylin/linux.git
drm/i915/gem: Require per-engine reset support for non-persistent contexts
To enable non-persistent contexts, we require a means of cancelling any inflight work from that context. This is first done "gracefully" by using preemption to kick the active context off the engine, and then forcefully by resetting the engine if it is active. If we are unable to reset the engine to remove hostile userspace, we should not allow userspace to opt into using non-persistent contexts. If the per-engine reset fails, we still do a full GPU reset, but that is rare and usually indicative of much deeper issues. The damage is already done. However, the goal of the interface to allow long running compute jobs without causing collateral damage elsewhere, and if we are unable to support that we should make that known by not providing the interface (and falsely pretending we can). Fixes:a0e047156c
("drm/i915/gem: Make context persistence optional") Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Cc: Jon Bloomfield <jon.bloomfield@intel.com> Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20200130164553.1937718-1-chris@chris-wilson.co.uk (cherry picked from commitd1b9b5f127
) Signed-off-by: Jani Nikula <jani.nikula@intel.com>
This commit is contained in:
parent
11a48a5a18
commit
dea8d5ce46
|
@ -565,6 +565,22 @@ static int __context_set_persistence(struct i915_gem_context *ctx, bool state)
|
|||
if (!(ctx->i915->caps.scheduler & I915_SCHEDULER_CAP_PREEMPTION))
|
||||
return -ENODEV;
|
||||
|
||||
/*
|
||||
* If the cancel fails, we then need to reset, cleanly!
|
||||
*
|
||||
* If the per-engine reset fails, all hope is lost! We resort
|
||||
* to a full GPU reset in that unlikely case, but realistically
|
||||
* if the engine could not reset, the full reset does not fare
|
||||
* much better. The damage has been done.
|
||||
*
|
||||
* However, if we cannot reset an engine by itself, we cannot
|
||||
* cleanup a hanging persistent context without causing
|
||||
* colateral damage, and we should not pretend we can by
|
||||
* exposing the interface.
|
||||
*/
|
||||
if (!intel_has_reset_engine(&ctx->i915->gt))
|
||||
return -ENODEV;
|
||||
|
||||
i915_gem_context_clear_persistence(ctx);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue