public inbox for drm-ai-reviews@public-inbox.freedesktop.org
 help / color / mirror / Atom feed
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
To: Maarten Lankhorst <dev@lankhorst.se>
Cc: intel-xe@lists.freedesktop.org, intel-gfx@lists.freedesktop.org,
	dri-devel@lists.freedesktop.org
Subject: Re: [PATCH v7 26/26] drm/i915/gt: Add a spinlock to prevent starvation of irq_work.
Date: Tue, 10 Mar 2026 18:04:13 +0100	[thread overview]
Message-ID: <20260310170413.5rCjlTce@linutronix.de> (raw)
In-Reply-To: <20260310115709.2276203-27-dev@lankhorst.se>

On 2026-03-10 12:57:08 [+0100], Maarten Lankhorst wrote:
> From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
> 
> IRQ-Work (FIFO-1) will be preempted by the threaded-interrupt (FIFO-50)
> and the interrupt will poll on signaler_active while the irq-work can't
> make progress.

The threaded-interrupt is the interrupt.

| On PREEMPT_RT the irq_work can be preempted by threaded-interrupt which
| will be poll for completion but the irq_work routine can't make
| progress.

> Solve this by adding a spinlock to prevent starvation and force
> completion.

| Solve this by adding a spinlock_t to prevent starvation by forcing a
| context switch if lock is held based on `signaler_active'. On
| !PREEMPT_RT `signaler_active' can only be non-zero if multiple CPUs are
| involved and spinning on the lock leds to the same result.

> Signed-off-by: Maarten Lankhorst <dev@lankhorst.se>

If I am the From: then I should have the Signed-off-by, too. Let me do
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>

so it can be picked up.

You did suggest the following:

--- a/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
+++ b/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
@@ -209,7 +209,7 @@ static void signal_irq_work(struct irq_work *work)
 		intel_breadcrumbs_disarm_irq(b);
 
 	rcu_read_lock();
-	atomic_inc(&b->signaler_active);
+	spin_lock(&b->signaler_active_sync);
 	list_for_each_entry_rcu(ce, &b->signalers, signal_link) {
 		struct i915_request *rq;
 
@@ -245,7 +245,7 @@ static void signal_irq_work(struct irq_work *work)
 				i915_request_put(rq);
 		}
 	}
-	atomic_dec(&b->signaler_active);
+	spin_unlock(&b->signaler_active_sync);
 	rcu_read_unlock();
 
 	llist_for_each_safe(signal, sn, signal) {
@@ -290,6 +290,7 @@ intel_breadcrumbs_create(struct intel_engine_cs *irq_engine)
 	init_llist_head(&b->signaled_requests);
 
 	spin_lock_init(&b->irq_lock);
+	spin_lock_init(&b->signaler_active_sync);
 	init_irq_work(&b->irq_work, signal_irq_work);
 
 	b->irq_engine = irq_engine;
@@ -487,8 +488,10 @@ void intel_context_remove_breadcrumbs(struct intel_context *ce,
 	if (release)
 		intel_context_put(ce);
 
-	while (atomic_read(&b->signaler_active))
-		cpu_relax();
+	while (spin_is_locked(&b->signaler_active_sync)) {
+		spin_lock_irqsave(&b->signaler_active_sync, flags);
+		spin_unlock_irqrestore(&b->signaler_active_sync, flags);

And this does not work because spin_is_locked() returns true and spins
forever. This fails because there is a "corner case" where
spin_is_locked() returns but the lock has no lock owner as in locked.
This happens if there is a waiter which did not yet acquire the lock. 

So if you happy with this, we could keep it ;)

+	}
 }
 
 static void print_signals(struct intel_breadcrumbs *b, struct drm_printer *p)
diff --git a/drivers/gpu/drm/i915/gt/intel_breadcrumbs_types.h b/drivers/gpu/drm/i915/gt/intel_breadcrumbs_types.h
index bdf09fd67b6e7..d071f4f1b1910 100644
--- a/drivers/gpu/drm/i915/gt/intel_breadcrumbs_types.h
+++ b/drivers/gpu/drm/i915/gt/intel_breadcrumbs_types.h
@@ -39,7 +39,7 @@ struct intel_breadcrumbs {
 	spinlock_t signalers_lock; /* protects the list of signalers */
 	struct list_head signalers;
 	struct llist_head signaled_requests;
-	atomic_t signaler_active;
+	spinlock_t signaler_active_sync;
 
 	spinlock_t irq_lock; /* protects the interrupt from hardirq context */
 	struct irq_work irq_work; /* for use from inside irq_lock */


Sebastian

  reply	other threads:[~2026-03-10 17:04 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-03-10 11:56 [PATCH v7 00/26] drm/i915/display: All patches to make PREEMPT_RT work on i915 + xe Maarten Lankhorst
2026-03-10 11:56 ` [PATCH v7 01/26] drm/vblank_work: Add methods to schedule vblank_work in 2 stages Maarten Lankhorst
2026-03-10 11:56 ` [PATCH v7 02/26] drm/vblank: Add a 2-stage version of drm_crtc_arm_vblank_event Maarten Lankhorst
2026-03-10 11:56 ` [PATCH v7 03/26] drm/intel/display: Make intel_crtc_arm_vblank_event static Maarten Lankhorst
2026-03-10 11:56 ` [PATCH v7 04/26] drm/intel/display: Convert vblank event handling to 2-stage arming Maarten Lankhorst
2026-03-10 11:56 ` [PATCH v7 05/26] drm/i915/display: Move vblank put until after critical section Maarten Lankhorst
2026-03-10 11:56 ` [PATCH v7 06/26] drm/i915/display: Remove locking from intel_vblank_evade " Maarten Lankhorst
2026-03-10 11:56 ` [PATCH v7 07/26] drm/i915/display: Handle vlv dsi workaround in scanline_in_safe_range too Maarten Lankhorst
2026-03-10 11:56 ` [PATCH v7 08/26] drm/i915: Use preempt_disable/enable_rt() where recommended Maarten Lankhorst
2026-03-10 11:56 ` [PATCH v7 09/26] drm/i915/display: Make get_vblank_counter use intel_de_read_fw() Maarten Lankhorst
2026-03-10 11:56 ` [PATCH v7 10/26] drm/i915/display: Do not take uncore lock in i915_get_vblank_counter Maarten Lankhorst
2026-03-10 11:56 ` [PATCH v7 11/26] drm/i915/display: Make icl_dsi_frame_update use _fw too Maarten Lankhorst
2026-03-10 11:56 ` [PATCH v7 12/26] drm/i915/display: Use intel_de_read/write_fw in colorops Maarten Lankhorst
2026-03-10 11:56 ` [PATCH v7 13/26] drm/i915/display: Use intel_de_write_fw in intel_pipe_fastset Maarten Lankhorst
2026-03-10 11:56 ` [PATCH v7 14/26] drm/i915/display: Make set_pipeconf use the fw variants Maarten Lankhorst
2026-03-10 11:56 ` [PATCH v7 15/26] drm/i915/display: Fix intel_lpe_audio_irq_handler for PREEMPT-RT Maarten Lankhorst
2026-03-10 11:56 ` [PATCH v7 16/26] drm/i915/gt: Use spin_lock_irq() instead of local_irq_disable() + spin_lock() Maarten Lankhorst
2026-03-10 11:56 ` [PATCH v7 17/26] drm/i915: Drop the irqs_disabled() check Maarten Lankhorst
2026-03-10 11:57 ` [PATCH v7 18/26] drm/i915/guc: Consider also RCU depth in busy loop Maarten Lankhorst
2026-03-10 11:57 ` [PATCH v7 19/26] drm/i915/gt: Fix selftests on PREEMPT_RT Maarten Lankhorst
2026-03-10 11:57 ` [PATCH v7 20/26] drm/i915/gt: Set stop_timeout() correctly on PREEMPT-RT Maarten Lankhorst
2026-03-10 11:57 ` [PATCH v7 21/26] drm/i915/display: Remove uncore lock from vlv_atomic_update_fifo Maarten Lankhorst
2026-03-10 11:57 ` [PATCH v7 22/26] drm/i915: Use sleeping selftests for igt_atomic on PREEMPT_RT Maarten Lankhorst
2026-03-10 11:57 ` [PATCH v7 23/26] Revert "drm/i915: Depend on !PREEMPT_RT." Maarten Lankhorst
2026-03-10 11:57 ` [PATCH v7 24/26] PREEMPT_RT injection Maarten Lankhorst
2026-03-10 11:57 ` [PATCH v7 25/26] FOR-CI: bump MAX_STACK_TRACE_ENTRIES Maarten Lankhorst
2026-03-10 11:57 ` [PATCH v7 26/26] drm/i915/gt: Add a spinlock to prevent starvation of irq_work Maarten Lankhorst
2026-03-10 17:04   ` Sebastian Andrzej Siewior [this message]
2026-03-10 18:14     ` Maarten Lankhorst
2026-03-10 17:22   ` Sebastian Andrzej Siewior
2026-03-10 19:03     ` Maarten Lankhorst
2026-03-11  3:21 ` Claude review: drm/i915/display: All patches to make PREEMPT_RT work on i915 + xe Claude Code Review Bot

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260310170413.5rCjlTce@linutronix.de \
    --to=bigeasy@linutronix.de \
    --cc=dev@lankhorst.se \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=intel-xe@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox