drm/i915: Hold irq-off for the entire fake lock period
Sadly lockdep records when the irqs are re-enabled and then marks up the fake lock as being irq-unsafe. Our hand is forced and so we must mark up the entire fake lock critical section as irq-off. Hopefully this is the last tweak required! v2: Not quite, we need to mark the timeline spinlock as irqsafe. That was a genuine bug being hidden by the earlier lockdep splat. Fixes:d67739268c
("drm/i915/gt: Mark up the nested engine-pm timeline lock as irqsafe") Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com> Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20190823132700.25286-2-chris@chris-wilson.co.uk (cherry picked from commit6dcb85a0ad
) Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
This commit is contained in:

committed by
Rodrigo Vivi

parent
0ac072cced
commit
ff36c5c4fd
@@ -1465,9 +1465,10 @@ bool i915_retire_requests(struct drm_i915_private *i915)
|
||||
{
|
||||
struct intel_gt_timelines *timelines = &i915->gt.timelines;
|
||||
struct intel_timeline *tl, *tn;
|
||||
unsigned long flags;
|
||||
LIST_HEAD(free);
|
||||
|
||||
spin_lock(&timelines->lock);
|
||||
spin_lock_irqsave(&timelines->lock, flags);
|
||||
list_for_each_entry_safe(tl, tn, &timelines->active_list, link) {
|
||||
if (!mutex_trylock(&tl->mutex))
|
||||
continue;
|
||||
@@ -1475,11 +1476,11 @@ bool i915_retire_requests(struct drm_i915_private *i915)
|
||||
intel_timeline_get(tl);
|
||||
GEM_BUG_ON(!tl->active_count);
|
||||
tl->active_count++; /* pin the list element */
|
||||
spin_unlock(&timelines->lock);
|
||||
spin_unlock_irqrestore(&timelines->lock, flags);
|
||||
|
||||
retire_requests(tl);
|
||||
|
||||
spin_lock(&timelines->lock);
|
||||
spin_lock_irqsave(&timelines->lock, flags);
|
||||
|
||||
/* Resume iteration after dropping lock */
|
||||
list_safe_reset_next(tl, tn, link);
|
||||
@@ -1494,7 +1495,7 @@ bool i915_retire_requests(struct drm_i915_private *i915)
|
||||
list_add(&tl->link, &free);
|
||||
}
|
||||
}
|
||||
spin_unlock(&timelines->lock);
|
||||
spin_unlock_irqrestore(&timelines->lock, flags);
|
||||
|
||||
list_for_each_entry_safe(tl, tn, &free, link)
|
||||
__intel_timeline_free(&tl->kref);
|
||||
|
Reference in New Issue
Block a user