Re: [PATCH mm-hotfixes] mm/page_alloc: prevent pcp corruption with SMP=n
From: Vlastimil Babka
Date: Tue Jan 06 2026 - 03:31:50 EST
On 1/5/26 22:40, Steven Rostedt wrote:
> On Mon, 05 Jan 2026 16:08:56 +0100
> Vlastimil Babka <vbabka@xxxxxxx> wrote:
>
>> +++ b/mm/page_alloc.c
>> @@ -167,6 +167,31 @@ static inline void __pcp_trylock_noop(unsigned long *flags) { }
>> pcp_trylock_finish(UP_flags); \
>> })
>>
>> +/*
>> + * With the UP spinlock implementation, when we spin_lock(&pcp->lock) (for i.e.
>> + * a potentially remote cpu drain) and get interrupted by an operation that
>> + * attempts pcp_spin_trylock(), we can't rely on the trylock failure due to UP
>> + * spinlock assumptions making the trylock a no-op. So we have to turn that
>> + * spin_lock() to a spin_lock_irqsave(). This works because on UP there are no
>> + * remote cpu's so we can only be locking the only existing local one.
>> + */
>> +#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT)
>> +static inline void __flags_noop(unsigned long *flags) { }
>> +#define spin_lock_maybe_irqsave(lock, flags) \
>> +({ \
>> + __flags_noop(&(flags)); \
>> + spin_lock(lock); \
>> +})
>> +#define spin_unlock_maybe_irqrestore(lock, flags) \
>> +({ \
>> + spin_unlock(lock); \
>> + __flags_noop(&(flags)); \
>> +})
>> +#else
>> +#define spin_lock_maybe_irqsave(lock, flags) spin_lock_irqsave(lock, flags)
>> +#define spin_unlock_maybe_irqrestore(lock, flags) spin_unlock_irqrestore(lock, flags)
>> +#endif
>> +
>
> These are very generic looking names for something specific for
> page_alloc.c. Could you add a prefix of some kind to make it easy to see
> that these are specific to the mm code?
>
> mm_spin_lock_maybe_irqsave() ?
OK, I think it's best like this:
----8<----