[Intel-gfx] [PATCH 5/8] drm/i915: Protect request retirement with timeline->mutex
Matthew Auld
matthew.william.auld at gmail.com
Thu Aug 15 20:33:07 UTC 2019
On Wed, 14 Aug 2019 at 10:28, Chris Wilson <chris at chris-wilson.co.uk> wrote:
>
> Forgo the struct_mutex requirement for request retirement as we have
> been transitioning over to only using the timeline->mutex for
> controlling the lifetime of a request on that timeline.
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
> .../gpu/drm/i915/gem/i915_gem_execbuffer.c | 183 ++++++++++--------
> drivers/gpu/drm/i915/gt/intel_context.h | 18 +-
> drivers/gpu/drm/i915/gt/intel_engine_cs.c | 1 -
> drivers/gpu/drm/i915/gt/intel_engine_types.h | 3 -
> drivers/gpu/drm/i915/gt/intel_gt.c | 2 -
> drivers/gpu/drm/i915/gt/intel_gt_types.h | 2 -
> drivers/gpu/drm/i915/gt/intel_lrc.c | 1 +
> drivers/gpu/drm/i915/gt/intel_ringbuffer.c | 19 +-
> drivers/gpu/drm/i915/gt/mock_engine.c | 1 -
> drivers/gpu/drm/i915/gt/selftest_context.c | 9 +-
> drivers/gpu/drm/i915/i915_request.c | 156 +++++++--------
> drivers/gpu/drm/i915/i915_request.h | 3 -
> 12 files changed, 209 insertions(+), 189 deletions(-)
>
> bool i915_retire_requests(struct drm_i915_private *i915)
> {
> - struct intel_ring *ring, *tmp;
> + struct intel_gt_timelines *timelines = &i915->gt.timelines;
> + struct intel_timeline *tl, *tn;
> + LIST_HEAD(free);
> +
> + spin_lock(&timelines->lock);
> + list_for_each_entry_safe(tl, tn, &timelines->active_list, link) {
> + if (!mutex_trylock(&tl->mutex))
> + continue;
>
> - lockdep_assert_held(&i915->drm.struct_mutex);
> + intel_timeline_get(tl);
> + GEM_BUG_ON(!tl->active_count);
> + tl->active_count++; /* pin the list element */
> + spin_unlock(&timelines->lock);
>
> - list_for_each_entry_safe(ring, tmp,
> - &i915->gt.active_rings, active_link) {
> - intel_ring_get(ring); /* last rq holds reference! */
> - ring_retire_requests(ring);
> - intel_ring_put(ring);
> + retire_requests(tl);
> +
> + spin_lock(&timelines->lock);
> +
> + /* Restart iteration after dropping lock */
> + list_safe_reset_next(tl, tn, link);
That's a new one.
"Several hours later",
Reviewed-by: Matthew Auld <matthew.auld at intel.com>
More information about the Intel-gfx
mailing list