Re: [PATCH 13/24] irq: Optimize reschedule check in local_interrupt_enable()
Peter Zijlstra <[email protected]> Mon, 3 Aug 2026 13:41:28 +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:14PM -0700, Boqun Feng wrote:
> In local_interrupt_enable(), we could avoid re-reading preempt count
> because of should_resched() by using the result from
> hardirq_disable_exit(), however this means __preempt_count_add_return()
> and __preempt_count_sub_return() need to return all the preempt count
> bits (including the PREEMPT_NEED_RESCHED bit), since the only user of
> __preempt_count_{add,sub}_return() is hardirq_disable_{enter,exit}(),
> hence make them return "unsigned long" to optimize this.
> static inline void local_interrupt_enable(void)
> {
> - int new_count;
> + unsigned long new_count;
>
> new_count = hardirq_disable_exit();
>
> @@ -52,15 +68,8 @@ static inline void local_interrupt_enable(void)
>
> flags = raw_cpu_read(local_interrupt_disable_state.flags);
> local_irq_restore(flags);
> - /*
> - * TODO: re-read preempt count can be avoided, but it needs
> - * should_resched() taking another parameter as the current
> - * preempt count
> - */
> -#ifdef CONFIG_PREEMPTION
> - if (should_resched(0))
> - __preempt_schedule();
> -#endif
> +
> + local_interrupt_enable_reched(new_count);
> }
> }
As stated before; this whole thing is a mystery to me, this should not
be needed.