]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
cleanup: Make __DEFINE_LOCK_GUARD handle commas in initializers
authorMarco Elver <elver@google.com>
Mon, 19 Jan 2026 09:05:51 +0000 (10:05 +0100)
committerPeter Zijlstra <peterz@infradead.org>
Wed, 28 Jan 2026 19:45:24 +0000 (20:45 +0100)
Initialization macros can expand to structure initializers containing
commas, which when used as a "lock" function resulted in errors such as:

>> include/linux/spinlock.h:582:56: error: too many arguments provided to function-like macro invocation
     582 | DEFINE_LOCK_GUARD_1(raw_spinlock_init, raw_spinlock_t, raw_spin_lock_init(_T->lock), /* */)
         |                                                        ^
   include/linux/spinlock.h:113:17: note: expanded from macro 'raw_spin_lock_init'
     113 |         do { *(lock) = __RAW_SPIN_LOCK_UNLOCKED(lock); } while (0)
         |                        ^
   include/linux/spinlock_types_raw.h:70:19: note: expanded from macro '__RAW_SPIN_LOCK_UNLOCKED'
      70 |         (raw_spinlock_t) __RAW_SPIN_LOCK_INITIALIZER(lockname)
         |                          ^
   include/linux/spinlock_types_raw.h:67:34: note: expanded from macro '__RAW_SPIN_LOCK_INITIALIZER'
      67 |         RAW_SPIN_DEP_MAP_INIT(lockname) }
         |                                         ^
   include/linux/cleanup.h:496:9: note: macro '__DEFINE_LOCK_GUARD_1' defined here
     496 | #define __DEFINE_LOCK_GUARD_1(_name, _type, _lock)                      \
         |         ^
   include/linux/spinlock.h:582:1: note: parentheses are required around macro argument containing braced initializer list
     582 | DEFINE_LOCK_GUARD_1(raw_spinlock_init, raw_spinlock_t, raw_spin_lock_init(_T->lock), /* */)
         | ^
         |                                                        (
   include/linux/cleanup.h:558:60: note: expanded from macro 'DEFINE_LOCK_GUARD_1'
     558 | __DEFINE_UNLOCK_GUARD(_name, _type, _unlock, __VA_ARGS__)               \
         |                                                                         ^

Make __DEFINE_LOCK_GUARD_0 and __DEFINE_LOCK_GUARD_1 variadic so that
__VA_ARGS__ captures everything.

Reported-by: kernel test robot <lkp@intel.com>
Signed-off-by: Marco Elver <elver@google.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://patch.msgid.link/20260119094029.1344361-2-elver@google.com
include/linux/cleanup.h

index ee6df68c2177b73aa7a184ef4af6c3d36e901acc..dbc4162921e9b2dac67f1912161abd64c9c5529e 100644 (file)
@@ -493,22 +493,22 @@ static __always_inline void class_##_name##_destructor(class_##_name##_t *_T) \
                                                                        \
 __DEFINE_GUARD_LOCK_PTR(_name, &_T->lock)
 
-#define __DEFINE_LOCK_GUARD_1(_name, _type, _lock)                     \
+#define __DEFINE_LOCK_GUARD_1(_name, _type, ...)                       \
 static __always_inline class_##_name##_t class_##_name##_constructor(_type *l) \
        __no_context_analysis                                           \
 {                                                                      \
        class_##_name##_t _t = { .lock = l }, *_T = &_t;                \
-       _lock;                                                          \
+       __VA_ARGS__;                                                    \
        return _t;                                                      \
 }
 
-#define __DEFINE_LOCK_GUARD_0(_name, _lock)                            \
+#define __DEFINE_LOCK_GUARD_0(_name, ...)                              \
 static __always_inline class_##_name##_t class_##_name##_constructor(void) \
        __no_context_analysis                                           \
 {                                                                      \
        class_##_name##_t _t = { .lock = (void*)1 },                    \
                         *_T __maybe_unused = &_t;                      \
-       _lock;                                                          \
+       __VA_ARGS__;                                                    \
        return _t;                                                      \
 }