Re: [PATCH 05/24] irq & spin_lock: Add counted interrupt disabling/enabling
Peter Zijlstra <[email protected]> Mon, 3 Aug 2026 11:19:19 +0200
| Newsgroups | org.kernel.vger.rust-for-linux,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
On Fri, Jul 31, 2026 at 01:30:06PM -0700, Boqun Feng wrote: > From: Boqun Feng <[email protected]> > > Currently the nested interrupt disabling and enabling is present by > _irqsave() and _irqrestore() APIs, which are relatively unsafe, for > example: > > <interrupts are enabled as beginning> > spin_lock_irqsave(l1, flag1); > spin_lock_irqsave(l2, flag2); > spin_unlock_irqrestore(l1, flags1); > <l2 is still held but interrupts are enabled> > // accesses to interrupt-disable protect data will cause races. > > This is even easier to triggered with guard facilities: > > unsigned long flag2; > > scoped_guard(spin_lock_irqsave, l1) { > spin_lock_irqsave(l2, flag2); > } > // l2 locked but interrupts are enabled. > spin_unlock_irqrestore(l2, flag2); > > (Hand-to-hand locking critical sections are not uncommon for a > fine-grained lock design) > > And because this unsafety, Rust cannot easily wrap the > interrupt-disabling locks in a safe API, which complicates the design. > > To resolve this, introduce a new set of interrupt disabling APIs: > > * local_interrupt_disable(); > * local_interrupt_enable(); > > They work like local_irq_save() and local_irq_restore() except that 1) > the outermost local_interrupt_disable() call save the interrupt state > into a percpu variable, so that the outermost local_interrupt_enable() > can restore the state, and 2) a percpu counter is added to record the > nest level of these calls, so that interrupts are not accidentally > enabled inside the outermost critical section. > > Also add the corresponding spin_lock primitives: spin_lock_irq_disable() > and spin_unlock_irq_enable(), as a result, code as follow: > > spin_lock_irq_disable(l1); > spin_lock_irq_disable(l2); > spin_unlock_irq_enable(l1); > // Interrupts are still disabled. > spin_unlock_irq_enable(l2); > > doesn't have the issue that interrupts are accidentally enabled. > > This also makes the wrapper of interrupt-disabling locks on Rust easier > to design. > > Signed-off-by: Lyude Paul <[email protected]> > Signed-off-by: Boqun Feng <[email protected]> > Link: https://patch.msgid.link/[email protected] Same SoB chain issue.