On Wed, 11 Feb 2026 15:22:13 +0000
Dmitry Ilvokhin <[email protected]> wrote:


> diff --git a/include/linux/zone_lock.h b/include/linux/zone_lock.h
> new file mode 100644
> index 000000000000..c531e26280e6
> --- /dev/null
> +++ b/include/linux/zone_lock.h
> @@ -0,0 +1,38 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +#ifndef _LINUX_ZONE_LOCK_H
> +#define _LINUX_ZONE_LOCK_H
> +
> +#include <linux/mmzone.h>
> +#include <linux/spinlock.h>
> +
> +static inline void zone_lock_init(struct zone *zone)
> +{
> +     spin_lock_init(&zone->lock);
> +}
> +
> +#define zone_lock_irqsave(zone, flags)                               \
> +do {                                                         \
> +     spin_lock_irqsave(&(zone)->lock, flags);                \
> +} while (0)
> +
> +#define zone_trylock_irqsave(zone, flags)                    \
> +({                                                           \
> +     spin_trylock_irqsave(&(zone)->lock, flags);             \
> +})
> +
> +static inline void zone_unlock_irqrestore(struct zone *zone, unsigned long 
> flags)
> +{
> +     spin_unlock_irqrestore(&zone->lock, flags);
> +}
> +
> +static inline void zone_lock_irq(struct zone *zone)
> +{
> +     spin_lock_irq(&zone->lock);
> +}
> +
> +static inline void zone_unlock_irq(struct zone *zone)
> +{
> +     spin_unlock_irq(&zone->lock);
> +}
> +
> +#endif /* _LINUX_ZONE_LOCK_H */

Have you thought about adding guards as well. It could make the code simpler:

  (Not tested)

#include <linux/cleanup.h>
[..]

DEFINE_LOCK_GUARD_1(zonelock_irqsave, struct zone *,
                    zone_lock_irqsave(_T->lock, _T->flags),
                    zone_unlock_irqrestore(_T->lock, _T->flags),
                    unsigned long flags)
DECLARE_LOCK_GUARD_1_ATTRS(zonelock_irqsave, __acquires(_T), 
__releases(*(struct zone ***)_T))
#define class_zonelock_irqsave_constructor(_T) 
WITH_LOCK_GUARD_1_ATTRS(zonelock_irqsave, _T)

DEFINE_LOCK_GUARD_1(zonelock_irq, struct zone *,
                    zone_lock_irq(_T->lock),
                    zone_unlock_irq(_T->lock))
DECLARE_LOCK_GUARD_1_ATTRS(zonelock_irq, __acquires(_T), __releases(*(struct 
zone ***)_T))
#define class_zonelock_irq_constructor(_T) 
WITH_LOCK_GUARD_1_ATTRS(zonelock_irq, _T)

Then you could even remove the "flags" variables from the C code, and some goto 
unlocks.

-- Steve

Reply via email to