52 lines
2.0 KiB
Diff
52 lines
2.0 KiB
Diff
From ef267547d87ddb45e423131cd3ac2575f11bf9a9 Mon Sep 17 00:00:00 2001
|
|
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|
Date: Wed, 10 Apr 2019 11:01:37 +0200
|
|
Subject: [PATCH 266/319] drm/i915: Don't disable interrupts independently of
|
|
the lock
|
|
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.103-rt42.tar.xz
|
|
|
|
The locks (timeline->lock and rq->lock) need to be taken with disabled
|
|
interrupts. This is done in __retire_engine_request() by disabling the
|
|
interrupts independently of the locks itself.
|
|
While local_irq_disable()+spin_lock() equals spin_lock_irq() on vanilla
|
|
it does not on RT. Also, it is not obvious if there is a special reason
|
|
to why the interrupts are disabled independently of the lock.
|
|
|
|
Enable/disable interrupts as part of the locking instruction.
|
|
|
|
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
|
|
---
|
|
drivers/gpu/drm/i915/i915_request.c | 8 ++------
|
|
1 file changed, 2 insertions(+), 6 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/i915/i915_request.c b/drivers/gpu/drm/i915/i915_request.c
|
|
index 5c2c93cbab12..7124510b9131 100644
|
|
--- a/drivers/gpu/drm/i915/i915_request.c
|
|
+++ b/drivers/gpu/drm/i915/i915_request.c
|
|
@@ -356,9 +356,7 @@ static void __retire_engine_request(struct intel_engine_cs *engine,
|
|
|
|
GEM_BUG_ON(!i915_request_completed(rq));
|
|
|
|
- local_irq_disable();
|
|
-
|
|
- spin_lock(&engine->timeline.lock);
|
|
+ spin_lock_irq(&engine->timeline.lock);
|
|
GEM_BUG_ON(!list_is_first(&rq->link, &engine->timeline.requests));
|
|
list_del_init(&rq->link);
|
|
spin_unlock(&engine->timeline.lock);
|
|
@@ -372,9 +370,7 @@ static void __retire_engine_request(struct intel_engine_cs *engine,
|
|
GEM_BUG_ON(!atomic_read(&rq->i915->gt_pm.rps.num_waiters));
|
|
atomic_dec(&rq->i915->gt_pm.rps.num_waiters);
|
|
}
|
|
- spin_unlock(&rq->lock);
|
|
-
|
|
- local_irq_enable();
|
|
+ spin_unlock_irq(&rq->lock);
|
|
|
|
/*
|
|
* The backing object for the context is done after switching to the
|
|
--
|
|
2.25.0
|
|
|