Re: [PATCH v13 01/17] preempt: Track NMI nesting to separate per-CPU counter

From: Joel Fernandes

Date: Tue Oct 14 2025 - 13:55:55 EST




On 10/14/2025 6:48 AM, Peter Zijlstra wrote:
> On Mon, Oct 13, 2025 at 11:48:03AM -0400, Lyude Paul wrote:
>
>> #define __nmi_enter() \
>> do { \
>> lockdep_off(); \
>> arch_nmi_enter(); \
>> - BUG_ON(in_nmi() == NMI_MASK); \
>> - __preempt_count_add(NMI_OFFSET + HARDIRQ_OFFSET); \
>> + BUG_ON(__this_cpu_read(nmi_nesting) == UINT_MAX); \
>> + __this_cpu_inc(nmi_nesting); \
>
> An NMI that nests from here..
>
>> + __preempt_count_add(HARDIRQ_OFFSET); \
>> + if (__this_cpu_read(nmi_nesting) == 1) \
>
> .. until here, will see nmi_nesting > 1 and not set NMI_OFFSET.

This is true, I can cure it by setting NMI_OFFSET unconditionally when
nmi_nesting >= 1. Then the outer most NMI will then reset it. I think that will
work. Do you see any other issue with doing so?

Thanks!

- Joel