mirror of
https://github.com/OpenVoiceOS/OpenVoiceOS
synced 2025-02-21 14:20:45 +01:00
48 lines
1.8 KiB
Diff
48 lines
1.8 KiB
Diff
From 4d40f5372b47b31497b77e31068597501ed016f3 Mon Sep 17 00:00:00 2001
|
|
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|
Date: Wed, 8 Sep 2021 17:18:00 +0200
|
|
Subject: [PATCH 163/196] drm/i915/gt: Queue and wait for the irq_work item.
|
|
|
|
Disabling interrupts and invoking the irq_work function directly breaks
|
|
on PREEMPT_RT.
|
|
PREEMPT_RT does not invoke all irq_work from hardirq context because
|
|
some of the user have spinlock_t locking in the callback function.
|
|
These locks are then turned into a sleeping locks which can not be
|
|
acquired with disabled interrupts.
|
|
|
|
Using irq_work_queue() has the benefit that the irqwork will be invoked
|
|
in the regular context. In general there is "no" delay between enqueuing
|
|
the callback and its invocation because the interrupt is raised right
|
|
away on architectures which support it (which includes x86).
|
|
|
|
Use irq_work_queue() + irq_work_sync() instead invoking the callback
|
|
directly.
|
|
|
|
Reported-by: Clark Williams <williams@redhat.com>
|
|
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|
Reviewed-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
|
|
---
|
|
drivers/gpu/drm/i915/gt/intel_breadcrumbs.c | 5 ++---
|
|
1 file changed, 2 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c b/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
|
|
index ecc990ec1b95..8d04b10681f0 100644
|
|
--- a/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
|
|
+++ b/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
|
|
@@ -312,10 +312,9 @@ void __intel_breadcrumbs_park(struct intel_breadcrumbs *b)
|
|
/* Kick the work once more to drain the signalers, and disarm the irq */
|
|
irq_work_sync(&b->irq_work);
|
|
while (READ_ONCE(b->irq_armed) && !atomic_read(&b->active)) {
|
|
- local_irq_disable();
|
|
- signal_irq_work(&b->irq_work);
|
|
- local_irq_enable();
|
|
+ irq_work_queue(&b->irq_work);
|
|
cond_resched();
|
|
+ irq_work_sync(&b->irq_work);
|
|
}
|
|
}
|
|
|
|
--
|
|
2.45.1
|
|
|