From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
To: Maarten Lankhorst <dev@lankhorst.se>
Cc: intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org,
linux-rt-devel@lists.linux.dev, dri-devel@lists.freedesktop.org
Subject: Re: [i915-rt v6 00/24] drm/i915/display: All patches to make PREEMPT_RT work on i915 + xe.
Date: Thu, 5 Mar 2026 11:50:22 +0100 [thread overview]
Message-ID: <20260305105022.cc1qAMoO@linutronix.de> (raw)
In-Reply-To: <98af7aba-f86f-4ff0-a53b-60e0e9784e37@lankhorst.se>
On 2026-03-05 11:42:19 [+0100], Maarten Lankhorst wrote:
> Hey,
Hi,
> Den 2026-02-26 kl. 15:38, skrev Sebastian Andrzej Siewior:
> > On 2026-02-26 15:19:42 [+0100], To Maarten Lankhorst wrote:
> >> On 2026-02-26 13:07:18 [+0100], To Maarten Lankhorst wrote:
> >>> series somewhere I could pull and check. In meantime I would look what
> >>> causes the lockup on i915.
> >>
> >> I think I got it.
> >
> > This the atomic sync as-is, 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.
> >
> > This will provide the needed sync:
> >
> > diff --git a/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c b/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
> > index a2b413982ce64..337f6e88faf05 100644
> > --- a/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
> > +++ b/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
> > @@ -209,6 +209,7 @@ static void signal_irq_work(struct irq_work *work)
> > intel_breadcrumbs_disarm_irq(b);
> >
> > rcu_read_lock();
> > + spin_lock(&b->signaler_active_sync);
> > atomic_inc(&b->signaler_active);
> > list_for_each_entry_rcu(ce, &b->signalers, signal_link) {
> > struct i915_request *rq;
> > @@ -246,6 +247,7 @@ static void signal_irq_work(struct irq_work *work)
> > }
> > }
> > atomic_dec(&b->signaler_active);
> > + spin_unlock(&b->signaler_active_sync);
> > rcu_read_unlock();
> >
> > llist_for_each_safe(signal, sn, signal) {
> > @@ -290,6 +292,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 +490,11 @@ void intel_context_remove_breadcrumbs(struct intel_context *ce,
> > if (release)
> > intel_context_put(ce);
> >
> > - while (atomic_read(&b->signaler_active))
> > + while (atomic_read(&b->signaler_active)) {
> > + spin_lock(&b->signaler_active_sync);
> > + spin_unlock(&b->signaler_active_sync);
> > cpu_relax();
> > + }
> > }
> >
> > 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..28dae32628aab 100644
> > --- a/drivers/gpu/drm/i915/gt/intel_breadcrumbs_types.h
> > +++ b/drivers/gpu/drm/i915/gt/intel_breadcrumbs_types.h
> > @@ -40,6 +40,7 @@ struct intel_breadcrumbs {
> > 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 */
> >
>
> Thinking some more, replacing signaler_active with signaler_active_sync might be the best fix.
> I'm not sure there's much use for parallel completion of the same breadcrumb, and using completion
> might be too heavy handed.
We have something similar in timer, tasklet and other "similar" code
where on RT you have preemption and therefore the possibility of another
user on the same CPU while on !RT it is only possible on a remote CPU.
Using the spinlock_t for synchronisation would restrict to one-on-one.
The closest API that comes to mind would be a sequence lock. One writer,
multiple reader. So that would be an option that you might like ;) If
the pure spinlock_t is off the table.
> Kind regards,
> ~Maarten Lankhorst
Sebastian
next prev parent reply other threads:[~2026-03-05 10:50 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-20 8:36 [i915-rt v6 00/24] drm/i915/display: All patches to make PREEMPT_RT work on i915 + xe Maarten Lankhorst
2026-02-20 8:36 ` [i915-rt v6 01/24] drm/vblank_work: Add methods to schedule vblank_work in 2 stages Maarten Lankhorst
2026-02-20 12:24 ` [i915-rt v6.1 1/1] " Maarten Lankhorst
2026-02-20 8:37 ` [i915-rt v6 02/24] drm/vblank: Add a 2-stage version of drm_crtc_arm_vblank_event Maarten Lankhorst
2026-02-20 8:37 ` [i915-rt v6 03/24] drm/intel/display: Make intel_crtc_arm_vblank_event static Maarten Lankhorst
2026-02-20 8:37 ` [i915-rt v6 04/24] drm/intel/display: Convert vblank event handling to 2-stage arming Maarten Lankhorst
2026-02-20 8:37 ` [i915-rt v6 05/24] drm/i915/display: Move vblank put until after critical section Maarten Lankhorst
2026-02-20 8:37 ` [i915-rt v6 06/24] drm/i915/display: Remove locking from intel_vblank_evade " Maarten Lankhorst
2026-02-20 8:37 ` [i915-rt v6 07/24] drm/i915/display: Handle vlv dsi workaround in scanline_in_safe_range too Maarten Lankhorst
2026-02-20 8:37 ` [i915-rt v6 08/24] drm/i915: Use preempt_disable/enable_rt() where recommended Maarten Lankhorst
2026-02-20 8:37 ` [i915-rt v6 09/24] drm/i915/display: Make get_vblank_counter use intel_de_read_fw() Maarten Lankhorst
2026-02-20 8:37 ` [i915-rt v6 10/24] drm/i915/display: Do not take uncore lock in i915_get_vblank_counter Maarten Lankhorst
2026-02-20 8:37 ` [i915-rt v6 11/24] drm/i915/display: Make icl_dsi_frame_update use _fw too Maarten Lankhorst
2026-02-20 8:37 ` [i915-rt v6 12/24] drm/i915/display: Use intel_de_read/write_fw in colorops Maarten Lankhorst
2026-02-20 8:37 ` [i915-rt v6 13/24] drm/i915/display: Use intel_de_write_fw in intel_pipe_fastset Maarten Lankhorst
2026-02-25 9:25 ` Jani Nikula
2026-02-25 11:59 ` Maarten Lankhorst
2026-02-20 8:37 ` [i915-rt v6 14/24] drm/i915/display: Make set_pipeconf use the fw variants Maarten Lankhorst
2026-02-20 8:37 ` [i915-rt v6 15/24] drm/i915/display: Fix intel_lpe_audio_irq_handler for PREEMPT-RT Maarten Lankhorst
2026-02-20 8:37 ` [i915-rt v6 16/24] drm/i915/gt: Use spin_lock_irq() instead of local_irq_disable() + spin_lock() Maarten Lankhorst
2026-02-20 8:37 ` [i915-rt v6 17/24] drm/i915: Drop the irqs_disabled() check Maarten Lankhorst
2026-02-20 8:37 ` [i915-rt v6 18/24] drm/i915/guc: Consider also RCU depth in busy loop Maarten Lankhorst
2026-02-20 8:37 ` [i915-rt v6 19/24] drm/i915/gt: Fix selftests on PREEMPT_RT Maarten Lankhorst
2026-02-20 8:37 ` [i915-rt v6 20/24] drm/i915/gt: Set stop_timeout() correctly on PREEMPT-RT Maarten Lankhorst
2026-02-20 8:37 ` [i915-rt v6 21/24] drm/i915/display: Remove uncore lock from vlv_atomic_update_fifo Maarten Lankhorst
2026-02-20 8:37 ` [i915-rt v6 22/24] Revert "drm/i915: Depend on !PREEMPT_RT." Maarten Lankhorst
2026-02-20 8:37 ` [i915-rt v6 23/24] PREEMPT_RT injection Maarten Lankhorst
2026-02-20 8:37 ` [i915-rt v6 24/24] FOR-CI: bump MAX_STACK_TRACE_ENTRIES Maarten Lankhorst
2026-02-24 14:15 ` Sebastian Andrzej Siewior
2026-02-25 12:32 ` Maarten Lankhorst
2026-02-24 16:27 ` [i915-rt v6 00/24] drm/i915/display: All patches to make PREEMPT_RT work on i915 + xe Sebastian Andrzej Siewior
2026-02-24 16:59 ` Sebastian Andrzej Siewior
2026-02-25 7:58 ` Sebastian Andrzej Siewior
2026-02-25 12:15 ` Maarten Lankhorst
2026-02-25 20:06 ` Maarten Lankhorst
2026-02-26 12:07 ` Sebastian Andrzej Siewior
2026-02-26 14:19 ` Sebastian Andrzej Siewior
2026-02-26 14:38 ` Sebastian Andrzej Siewior
2026-03-05 10:19 ` Maarten Lankhorst
2026-03-05 10:42 ` Maarten Lankhorst
2026-03-05 10:50 ` Sebastian Andrzej Siewior [this message]
2026-03-05 11:11 ` Maarten Lankhorst
2026-03-05 11:19 ` Sebastian Andrzej Siewior
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=20260305105022.cc1qAMoO@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 \
--cc=linux-rt-devel@lists.linux.dev \
/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