[Intel-gfx] [PATCH 13/20] drm/i915: Teach execbuffer to take the engine wakeref not GT
Tvrtko Ursulin
tvrtko.ursulin at linux.intel.com
Mon Jul 22 16:03:31 UTC 2019
On 18/07/2019 08:00, Chris Wilson wrote:
> In the next patch, we would like to couple into the engine wakeref to
> free the batch pool on idling. The caveat here is that we therefore want
> to track the engine wakeref more precisely and to hold it instead of the
> broader GT wakeref as we process the ioctl.
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
> .../gpu/drm/i915/gem/i915_gem_execbuffer.c | 36 ++++++++++++-------
> drivers/gpu/drm/i915/gt/intel_context.h | 7 ++++
> 2 files changed, 31 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
> index cbd7c6e3a1f8..8768d436e54b 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
> @@ -2138,13 +2138,35 @@ static int eb_pin_context(struct i915_execbuffer *eb, struct intel_context *ce)
> if (err)
> return err;
>
> + /*
> + * Take a local wakeref for preparing to dispatch the execbuf as
> + * we expect to access the hardware fairly frequently in the
> + * process. Upon first dispatch, we acquire another prolonged
> + * wakeref that we hold until the GPU has been idle for at least
> + * 100ms.
Old comment but slightly not business of this layer to talk about 100ms.
> + */
> + err = intel_context_timeline_lock(ce);
> + if (err)
> + goto err_unpin;
> +
> + intel_context_enter(ce);
> + intel_context_timeline_unlock(ce);
> +
> eb->engine = ce->engine;
> eb->context = ce;
> return 0;
> +
> +err_unpin:
> + intel_context_unpin(ce);
> + return err;
> }
>
> static void eb_unpin_context(struct i915_execbuffer *eb)
> {
> + __intel_context_timeline_lock(eb->context);
Slight misuse of established semantics for underscores. (I'd expect no
locking, or something along those lines, not a difference between
interruptible and non-interruptible.)
> + intel_context_exit(eb->context);
> + intel_context_timeline_unlock(eb->context);
> +
> intel_context_unpin(eb->context);
> }
>
> @@ -2425,18 +2447,9 @@ i915_gem_do_execbuffer(struct drm_device *dev,
> if (unlikely(err))
> goto err_destroy;
>
> - /*
> - * Take a local wakeref for preparing to dispatch the execbuf as
> - * we expect to access the hardware fairly frequently in the
> - * process. Upon first dispatch, we acquire another prolonged
> - * wakeref that we hold until the GPU has been idle for at least
> - * 100ms.
> - */
> - intel_gt_pm_get(&eb.i915->gt);
> -
> err = i915_mutex_lock_interruptible(dev);
> if (err)
> - goto err_rpm;
> + goto err_context;
>
> err = eb_select_engine(&eb, file, args);
> if (unlikely(err))
> @@ -2601,8 +2614,7 @@ i915_gem_do_execbuffer(struct drm_device *dev,
> eb_unpin_context(&eb);
> err_unlock:
> mutex_unlock(&dev->struct_mutex);
> -err_rpm:
> - intel_gt_pm_put(&eb.i915->gt);
> +err_context:
> i915_gem_context_put(eb.gem_context);
> err_destroy:
> eb_destroy(&eb);
> diff --git a/drivers/gpu/drm/i915/gt/intel_context.h b/drivers/gpu/drm/i915/gt/intel_context.h
> index 23c7e4c0ce7c..485886d84a56 100644
> --- a/drivers/gpu/drm/i915/gt/intel_context.h
> +++ b/drivers/gpu/drm/i915/gt/intel_context.h
> @@ -127,6 +127,13 @@ static inline void intel_context_put(struct intel_context *ce)
> kref_put(&ce->ref, ce->ops->destroy);
> }
>
> +static inline void
> +__intel_context_timeline_lock(struct intel_context *ce)
> + __acquires(&ce->ring->timeline->mutex)
> +{
> + mutex_lock(&ce->ring->timeline->mutex);
> +}
> +
> static inline int __must_check
> intel_context_timeline_lock(struct intel_context *ce)
> __acquires(&ce->ring->timeline->mutex)
>
But passable.
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
Regards,
Tvrtko
More information about the Intel-gfx
mailing list