Re: [PATCH] rqspinlock: Fix order in raw_res_spin_(un)lock_irq to allow schedule

From: Gabriele Monaco

Date: Tue Jun 09 2026 - 09:11:41 EST


On Tue, 2026-06-09 at 13:22 +0200, Arnd Bergmann wrote:
> Should this be Cc:stable@xxxxxxxxxxxxxxx to get backported?

Not sure if the Fixes: is enough to trigger the automation, I rarely
remember to Cc:stable@xxxxxxxxxxxxxxx and they're usually picked.

In case I guess I'd need to re-submit the patch right?

> Did you see this cause measurable performance problems,
> or did you find it through inspection?

I noticed it while debugging an ENOMEM issue in the test_maps BPF
selftest on PREEMPT_RT and this was an obvious cuplrit (irq_work not
scheduled during a stress run). Turns out the problem is still there
after this fix though.

>
> > Signed-off-by: Gabriele Monaco <gmonaco@xxxxxxxxxx>
>
> Acked-by: Arnd Bergmann <arnd@xxxxxxxx> # asm-generic

Thanks,
Gabriele

>
> This should probably get merged through the BPF tree, but I've
> added the kernel/locking maintainers to Cc as well, since I
> feel it's more useful to have them look at it than me.
>
> Maybe it would be good to update (as a separate patch) the
> MAINTAINERS file so the locking subsystem also includes the
> headers currently missing:
>
> arch/*/include/asm/*spinlock*.h
> arch/*/include/asm/*rwlock*.h
> include/asm-generic/*spinlock*.h
> include/asm-generic/*rwlock*.h
>
>        Arnd
>
> (full patch quoted below)
>
> > ---
> >  include/asm-generic/rqspinlock.h | 14 +++++++++++---
> >  1 file changed, 11 insertions(+), 3 deletions(-)
> >
> > diff --git a/include/asm-generic/rqspinlock.h
> > b/include/asm-generic/rqspinlock.h
> > index 151d267a49..4d46643f46 100644
> > --- a/include/asm-generic/rqspinlock.h
> > +++ b/include/asm-generic/rqspinlock.h
> > @@ -243,12 +243,20 @@ static __always_inline void
> > res_spin_unlock(rqspinlock_t *lock)
> >   ({                                        \
> >   int __ret;                        \
> >   local_irq_save(flags);            \
> > - __ret = raw_res_spin_lock(lock);  \
> > - if (__ret)                        \
> > + preempt_disable();                \
> > + __ret = res_spin_lock(lock);      \
> > + if (__ret) {                      \
> >   local_irq_restore(flags); \
> > + preempt_enable();         \
> > + }                                 \
> >   __ret;                            \
> >   })
> >
> > -#define raw_res_spin_unlock_irqrestore(lock, flags) ({
> > raw_res_spin_unlock(lock); local_irq_restore(flags); })
> > +#define raw_res_spin_unlock_irqrestore(lock, flags) \
> > + ({                                          \
> > + res_spin_unlock(lock);              \
> > + local_irq_restore(flags);           \
> > + preempt_enable();                   \
> > + })
> >
> >  #endif /* __ASM_GENERIC_RQSPINLOCK_H */
> >
> > base-commit: e43ffb69e0438cddd72aaa30898b4dc446f664f8
> > --
> > 2.54.0