Re: [PATCH 05/24] irq & spin_lock: Add counted interrupt disabling/enabling

Peter Zijlstra <[email protected]> Mon, 3 Aug 2026 16:34:26 +0200
Newsgroups org.kernel.vger.rust-for-linux,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
On Mon, Aug 03, 2026 at 04:33:15PM +0200, Peter Zijlstra wrote:
> On Mon, Aug 03, 2026 at 04:21:06PM +0200, Peter Zijlstra wrote:
> 
> > No; for one, you cannot elide the preempt_disable/enable() from this
> > thing.
> > 
> > It has always been valid to do:
> > 
> > 	raw_spin_lock_irq(lock);
> > 	...
> > 	raw_spin_unlock(lock);
> > 	...
> > 	local_irq_enable();
> > 
> > And since raw_spin_unlock() does have the preemption thing,
> > raw_spin_lock_irq() must too. And the very same argument is still valid
> > if you now write:
> > 
> > 	raw_spin_lock_irq_disable(lock);
> > 	...
> > 	raw_spin_unlock(lock);
> > 	...
> > 	local_interrupt_enable();
> > 
> > Secondly, nothing should 'set' NEED_RESCHED without also immediately
> > causing a preemption.
> 
> Notably, scheduler_ipi() is the one that folds TIF_NEED_RESCHED into
> PREEMPT_NEED_RESCHED for remote reschedules.

(and note that this is exactly the from hardirq context on current usage
as per the below...)

> Other than that, set_preempt_need_resched() must always be used from
> hardirq context or inside the schedule() loop on current. When used from
> hardirq context, the interrupt-return path will handle the reschedule,
> when used inside the schedule() loop, the loop will.
> 
> No other fiddling of NEED_RESCHED should occur.