diff mbox series

[2/5] drm/i915: Serialise with remote retirement

Message ID 20191121071044.97798-2-chris@chris-wilson.co.uk (mailing list archive)
State New, archived
Headers show
Series [1/5] Revert "drm/i915/gt: Wait for new requests in intel_gt_retire_requests()" | expand

Commit Message

Chris Wilson Nov. 21, 2019, 7:10 a.m. UTC
Since retirement may be running in a worker on another CPU, it may be
skipped in the local intel_gt_wait_for_idle(). To ensure the state is
consistent for our sanity checks upon load, serialise with the remote
retirer by waiting on the timeline->mutex.

Outside of this use case, e.g. on suspend or module unload, we expect the
slack to be picked up by intel_gt_pm_wait_for_idle() and so prefer to
put the special case serialisation with retirement in its single user,
for now at least.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
---
 drivers/gpu/drm/i915/i915_gem.c | 26 +++++++++++++++++++++++---
 1 file changed, 23 insertions(+), 3 deletions(-)

Comments

Tvrtko Ursulin Nov. 21, 2019, 11:47 a.m. UTC | #1
On 21/11/2019 07:10, Chris Wilson wrote:
> Since retirement may be running in a worker on another CPU, it may be
> skipped in the local intel_gt_wait_for_idle(). To ensure the state is
> consistent for our sanity checks upon load, serialise with the remote
> retirer by waiting on the timeline->mutex.
> 
> Outside of this use case, e.g. on suspend or module unload, we expect the
> slack to be picked up by intel_gt_pm_wait_for_idle() and so prefer to
> put the special case serialisation with retirement in its single user,
> for now at least.
> 
> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> ---
>   drivers/gpu/drm/i915/i915_gem.c | 26 +++++++++++++++++++++++---
>   1 file changed, 23 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index 1ba5f26700b0..61395b03443e 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -45,6 +45,7 @@
>   #include "gem/i915_gem_context.h"
>   #include "gem/i915_gem_ioctls.h"
>   #include "gem/i915_gem_pm.h"
> +#include "gt/intel_context.h"
>   #include "gt/intel_engine_user.h"
>   #include "gt/intel_gt.h"
>   #include "gt/intel_gt_pm.h"
> @@ -1041,6 +1042,18 @@ i915_gem_madvise_ioctl(struct drm_device *dev, void *data,
>   	return err;
>   }
>   
> +static int __intel_context_flush_retire(struct intel_context *ce)
> +{
> +	struct intel_timeline *tl;
> +
> +	tl = intel_context_timeline_lock(ce);
> +	if (IS_ERR(tl))
> +		return PTR_ERR(tl);
> +
> +	intel_context_timeline_unlock(tl);
> +	return 0;
> +}
> +
>   static int __intel_engines_record_defaults(struct intel_gt *gt)
>   {
>   	struct i915_request *requests[I915_NUM_ENGINES] = {};
> @@ -1109,13 +1122,20 @@ static int __intel_engines_record_defaults(struct intel_gt *gt)
>   		if (!rq)
>   			continue;
>   
> -		/* We want to be able to unbind the state from the GGTT */
> -		GEM_BUG_ON(intel_context_is_pinned(rq->hw_context));
> -
> +		GEM_BUG_ON(!test_bit(CONTEXT_ALLOC_BIT,
> +				     &rq->hw_context->flags));
>   		state = rq->hw_context->state;
>   		if (!state)
>   			continue;
>   
> +		/* Serialise with retirement on another CPU */
> +		err = __intel_context_flush_retire(rq->hw_context);
> +		if (err)
> +			goto out;
> +
> +		/* We want to be able to unbind the state from the GGTT */
> +		GEM_BUG_ON(intel_context_is_pinned(rq->hw_context));
> +
>   		/*
>   		 * As we will hold a reference to the logical state, it will
>   		 * not be torn down with the context, and importantly the
> 

Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>

Regards,

Tvrtko
diff mbox series

Patch

diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 1ba5f26700b0..61395b03443e 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -45,6 +45,7 @@ 
 #include "gem/i915_gem_context.h"
 #include "gem/i915_gem_ioctls.h"
 #include "gem/i915_gem_pm.h"
+#include "gt/intel_context.h"
 #include "gt/intel_engine_user.h"
 #include "gt/intel_gt.h"
 #include "gt/intel_gt_pm.h"
@@ -1041,6 +1042,18 @@  i915_gem_madvise_ioctl(struct drm_device *dev, void *data,
 	return err;
 }
 
+static int __intel_context_flush_retire(struct intel_context *ce)
+{
+	struct intel_timeline *tl;
+
+	tl = intel_context_timeline_lock(ce);
+	if (IS_ERR(tl))
+		return PTR_ERR(tl);
+
+	intel_context_timeline_unlock(tl);
+	return 0;
+}
+
 static int __intel_engines_record_defaults(struct intel_gt *gt)
 {
 	struct i915_request *requests[I915_NUM_ENGINES] = {};
@@ -1109,13 +1122,20 @@  static int __intel_engines_record_defaults(struct intel_gt *gt)
 		if (!rq)
 			continue;
 
-		/* We want to be able to unbind the state from the GGTT */
-		GEM_BUG_ON(intel_context_is_pinned(rq->hw_context));
-
+		GEM_BUG_ON(!test_bit(CONTEXT_ALLOC_BIT,
+				     &rq->hw_context->flags));
 		state = rq->hw_context->state;
 		if (!state)
 			continue;
 
+		/* Serialise with retirement on another CPU */
+		err = __intel_context_flush_retire(rq->hw_context);
+		if (err)
+			goto out;
+
+		/* We want to be able to unbind the state from the GGTT */
+		GEM_BUG_ON(intel_context_is_pinned(rq->hw_context));
+
 		/*
 		 * As we will hold a reference to the logical state, it will
 		 * not be torn down with the context, and importantly the