aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/gt/intel_timeline.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2019-08-23 14:26:46 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2019-08-23 19:44:21 +0100
commit6dcb85a0ad990455ae7c596e3fc966ad9c1ba9c5 (patch)
tree646ebb8f3c7eb9b207d44f9a1c5b2af16b8a7eb5 /drivers/gpu/drm/i915/gt/intel_timeline.c
parentdrm/i915: Use hweight8() for 8bit masks (diff)
downloadlinux-dev-6dcb85a0ad990455ae7c596e3fc966ad9c1ba9c5.tar.xz
linux-dev-6dcb85a0ad990455ae7c596e3fc966ad9c1ba9c5.zip
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: d67739268cf0 ("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
Diffstat (limited to 'drivers/gpu/drm/i915/gt/intel_timeline.c')
-rw-r--r--drivers/gpu/drm/i915/gt/intel_timeline.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/gpu/drm/i915/gt/intel_timeline.c b/drivers/gpu/drm/i915/gt/intel_timeline.c
index 02fbe11b671b..9cb01d9828f1 100644
--- a/drivers/gpu/drm/i915/gt/intel_timeline.c
+++ b/drivers/gpu/drm/i915/gt/intel_timeline.c
@@ -337,6 +337,7 @@ int intel_timeline_pin(struct intel_timeline *tl)
void intel_timeline_enter(struct intel_timeline *tl)
{
struct intel_gt_timelines *timelines = &tl->gt->timelines;
+ unsigned long flags;
lockdep_assert_held(&tl->mutex);
@@ -345,14 +346,15 @@ void intel_timeline_enter(struct intel_timeline *tl)
return;
GEM_BUG_ON(!tl->active_count); /* overflow? */
- spin_lock(&timelines->lock);
+ spin_lock_irqsave(&timelines->lock, flags);
list_add(&tl->link, &timelines->active_list);
- spin_unlock(&timelines->lock);
+ spin_unlock_irqrestore(&timelines->lock, flags);
}
void intel_timeline_exit(struct intel_timeline *tl)
{
struct intel_gt_timelines *timelines = &tl->gt->timelines;
+ unsigned long flags;
lockdep_assert_held(&tl->mutex);
@@ -360,9 +362,9 @@ void intel_timeline_exit(struct intel_timeline *tl)
if (--tl->active_count)
return;
- spin_lock(&timelines->lock);
+ spin_lock_irqsave(&timelines->lock, flags);
list_del(&tl->link);
- spin_unlock(&timelines->lock);
+ spin_unlock_irqrestore(&timelines->lock, flags);
/*
* Since this timeline is idle, all bariers upon which we were waiting