From nobody Thu Oct 9 20:24:39 2025 Received: from mail-pj1-f49.google.com (mail-pj1-f49.google.com [209.85.216.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 61D062BD590 for ; Mon, 16 Jun 2025 11:14:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750072484; cv=none; b=ocW6CXNpexQtgQUWAG7K0p2N9LKKoPar412NPfuhelAsz4asdfPeu2sTy2LWWBDo0ksV4HYbRsvw6yRXkKjet2/wl8Z1NFqnXpFKKNAIiET+UumPvc3ug+PQO2WtuKnFI0iEWXhliNf77fBPeTUPG+EtBFVkoGfu4XFAk85iTZk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750072484; c=relaxed/simple; bh=6Q4lTW1IouaxpKB+d14X1ybS3qaRISqHEQ+qUwCTTnQ=; h=From:To:Subject:Date:Message-ID:MIME-Version; b=kBYUVSWVCWTpYO5zp5IbOMyRf2VPG/72lfgUg12TVWyAibWDOT/a+6UOKWZ9JlUUsFL1uEvH+yUDux/hv6nQFRYmYTVZh11yqA/WewP14VnN33+nWV5py+czQRwokxyfPUl7yoE7/xiAmzDrgJFjKN09WlGH+GE1GG5nXzvZ2P4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=GH08SmwE; arc=none smtp.client-ip=209.85.216.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="GH08SmwE" Received: by mail-pj1-f49.google.com with SMTP id 98e67ed59e1d1-311d5fdf1f0so4118386a91.1 for ; Mon, 16 Jun 2025 04:14:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1750072482; x=1750677282; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:from:to:cc:subject:date:message-id:reply-to; bh=hO4WaEugtaUK+DaSYAXwZc4Zo1ulGjOjTT5MVAqXqNk=; b=GH08SmwEyU8YrM+IHEhGKIngg/HMGDaNpbtpGDee24MamXjka8gT7JoP5wiPaeoz/Z k9n+cve+8WG6ny8tcTrVgkKgfA5jEj0/rMatqtyt0dB2oCPHuBlQv0BhDzy/7CUkKCIz 2C7xtbNokR376cCJhVFMo4+9oKAlo4Xe0BP122DNlUt1SlB8ZugtEhcsvoPIbgIy6oM1 AQY470mzCRGrtdCa/1s4Zaqa8XZT0MUwnc428qwGfbQafBmBGA9fBgRMGiXsU5CG8f3l zHIjMTmjuI3f73nvc8qfMbHesLwQ5kCZ38WOtajJyALSTH79sTzQaDChpLVblAnDaEwK 6zUw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750072482; x=1750677282; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=hO4WaEugtaUK+DaSYAXwZc4Zo1ulGjOjTT5MVAqXqNk=; b=UJxk8rq6548C87QytXmWGvtwnl0py2UjE0dwKTeiWPk2jLA1ChiN/MjfSkTeGB3xGE 0tCF3L27683vzBv3J5z050HjjChqch1hOz+lQQlauXlqMrGtPRLyjeI6xbBXLFzCmsli qdSu22NJcbmxXxu9cjwUIS1vOAt/ipFpk3RZBtlEEObV5uXXykUblwwBoYK8cTO1XuL7 Ox6Tq6F2rM+M0bfEb7D786z+YWZ+UHeyA2GsXZdHcXRZFDuqTlbij451432Ax9misk5W sgZQF3k9QJu4JJiOSPTzes2S9SgaAtMAAn1cjzyv3cfPQMi4eNX2wbr7HHslo8XnYNFi u/IQ== X-Forwarded-Encrypted: i=1; AJvYcCX71xP3w0E5/hjjinSdREg3iB95ilh6XJP2V4bmUZH//8Q7+kCAHaCEtpZZjajy8HS/uZf9hC5vD7omPT8=@vger.kernel.org X-Gm-Message-State: AOJu0YxVczRQkaELHkNZotvBIoMcNRDVjgrLzK62pehJzPrYiOMkgan8 j7Z6o2W5eqANoC9ZDnIMElXcdnU1xzARxMUMGA2vux/gk4ejriEDbm5XqX9D9PVa X-Gm-Gg: ASbGnctUmgFgJTEW6ksaR1kYvWQdlxQUh+IxpKgbSbVeRXELZYp4biGkOwIFNjHYwZX ZrDeBzka4qBEOPWKaGBIlAjNsf1N4WL3b5c4MP2dVVeGt5j+yHUvpA4v4HgW3cX3esN5HSTisA6 QLY0uY01SSYw1M1rEX0+8Njlhp1KgnzMnOiUVz+3PbmZoBnTYqCEE/wXTq4/38QBuTCnJBjd5E4 ThbAu1jEVqjkyMnxgcg9D8k58hSOIT9eq3Apjg4OjkwEDNQI1+6qo7Iy05Eq3YRBeqI1QmxCfgY 2kzgetXSSSe+WnSTL2luNZDtxNZW5+k37tugn1vAMzLsk3xcwgMHycprv0GMl0Nuobkh2Dr83Jg = X-Google-Smtp-Source: AGHT+IFBUZ4AYnjT0CbC/b345pJnEx6Wv33Y68oKJi7yPJRqZXJfMIhyuCZh3kuC7UoKFDDUxaGSKA== X-Received: by 2002:a17:90b:52c6:b0:311:e8cc:424c with SMTP id 98e67ed59e1d1-313f1dee421mr13889091a91.25.1750072481563; Mon, 16 Jun 2025 04:14:41 -0700 (PDT) Received: from localhost ([180.172.46.169]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2365de78292sm58444295ad.133.2025.06.16.04.14.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Jun 2025 04:14:41 -0700 (PDT) From: Jemmy Wong To: Peter Zijlstra , Thomas Gleixner , Dan Williams , Christian Brauner , Jonathan Cameron , Al Viro , =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , David Lechner , Przemek Kitszel , Jemmy Wong , Ingo Molnar , linux-kernel@vger.kernel.org Subject: [PATCH v0] [RFC] cleanup: Unify DEFINE_LOCK_GUARD_0 and DEFINE_LOCK_GUARD_1 Date: Mon, 16 Jun 2025 19:14:36 +0800 Message-ID: <20250616111436.665171-1-jemmywong512@gmail.com> X-Mailer: git-send-email 2.43.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Hi, This patch consolidates the DEFINE_LOCK_GUARD_0 and DEFINE_LOCK_GUARD_1 macros into a single, unified 'DEFINE_LOCK_GUARD' macro to provide a consistent and simplified API for lock guard definitions. API changes: From DEFINE_LOCK_GUARD_0(name, lock, unlock, ...) to DEFINE_LOCK_GUARD(name, *void*, lock, unlock, ...) From DEFINE_LOCK_GUARD_1(name, type, lock, unlock, ...) to DEFINE_LOCK_GUARD(name, type, lock, unlock, ...) From CLASS(name, var)(args...) to CLASS(name, var, args...) From guard(name)(args) to guard(name, args) No change: scoped_guard(name, args...) scoped_cond_guard(name, fail, args...) --- Deailted changes: - DEFINE_CLASS(_name, _type, _exit, _init, _init_args...) The void type for _init_args is not required when the constructor takes no = arguments, as an int argc is implicitly inserted as the first argument. (int argc, voi= d) is an error. This patch includes only the core changes. Follow-up patches will be submitted once the approach is accepted. Best, Jemmy --- include/linux/cleanup.h | 50 +++++++++++++++++++++++++++++++---------- 1 file changed, 38 insertions(+), 12 deletions(-) diff --git a/include/linux/cleanup.h b/include/linux/cleanup.h index 7093e1d08af0..2a4c3a96d37b 100644 --- a/include/linux/cleanup.h +++ b/include/linux/cleanup.h @@ -2,6 +2,7 @@ #ifndef _LINUX_CLEANUP_H #define _LINUX_CLEANUP_H +#include #include /** @@ -259,24 +260,28 @@ const volatile void * __must_check_fn(const volatile = void *val) * // use 'f' without concern */ +#define __ARGC(_9, _8, _7, _6, _5, _4, _3, _2, _1, N, ...) N +#define ARGC(...) __ARGC(9, ##__VA_ARGS__, 8, 7, 6, 5, 4, 3, 2, 1, 0) + #define DEFINE_CLASS(_name, _type, _exit, _init, _init_args...) \ typedef _type class_##_name##_t; \ static inline void class_##_name##_destructor(_type *p) \ { _type _T =3D *p; _exit; } \ -static inline _type class_##_name##_constructor(_init_args) \ +static inline _type class_##_name##_constructor(int argc, ##_init_args) \ { _type t =3D _init; return t; } #define EXTEND_CLASS(_name, ext, _init, _init_args...) \ typedef class_##_name##_t class_##_name##ext##_t; \ static inline void class_##_name##ext##_destructor(class_##_name##_t *p)\ { class_##_name##_destructor(p); } \ -static inline class_##_name##_t class_##_name##ext##_constructor(_init_arg= s) \ +static inline class_##_name##_t class_##_name##ext##_constructor(int argc,= ##_init_args) \ { class_##_name##_t t =3D _init; return t; } -#define CLASS(_name, var) \ +#define __CLASS(_name, var, argc, args...) \ class_##_name##_t var __cleanup(class_##_name##_destructor) =3D \ - class_##_name##_constructor + class_##_name##_constructor(argc, ##args) +#define CLASS(_name, var, args...) __CLASS(_name, var, ARGC(args), ##args) /* * DEFINE_GUARD(name, type, lock, unlock): @@ -334,8 +339,8 @@ static __maybe_unused const bool class_##_name##_is_con= ditional =3D _is_cond static inline void * class_##_name##_ext##_lock_ptr(class_##_name##_t *_T= ) \ { return class_##_name##_lock_ptr(_T); } -#define guard(_name) \ - CLASS(_name, __UNIQUE_ID(guard)) +#define guard(_name, args...) \ + __CLASS(_name, __UNIQUE_ID(guard), ARGC(args), ##args) #define __guard_ptr(_name) class_##_name##_lock_ptr #define __is_cond_ptr(_name) class_##_name##_is_conditional @@ -349,8 +354,8 @@ static __maybe_unused const bool class_##_name##_is_con= ditional =3D _is_cond * It is needed because the other part - "__guard_ptr(_name)(&scope)" - is= too * hard to deduce (even if could be proven true for unconditional locks). */ -#define __scoped_guard(_name, _label, args...) \ - for (CLASS(_name, scope)(args); \ +#define __scoped_guard(_name, _label, argc, args...) \ + for (__CLASS(_name, scope, argc, ##args); \ __guard_ptr(_name)(&scope) || !__is_cond_ptr(_name); \ ({ goto _label; })) \ if (0) { \ @@ -359,10 +364,10 @@ _label: \ } else #define scoped_guard(_name, args...) \ - __scoped_guard(_name, __UNIQUE_ID(label), args) + __scoped_guard(_name, __UNIQUE_ID(label), ARGC(args), ##args) -#define __scoped_cond_guard(_name, _fail, _label, args...) \ - for (CLASS(_name, scope)(args); true; ({ goto _label; })) \ +#define __scoped_cond_guard(_name, _fail, _label, argc, args...) \ + for (__CLASS(_name, scope, argc, ##args); true; ({ goto _label; })) \ if (!__guard_ptr(_name)(&scope)) { \ BUILD_BUG_ON(!__is_cond_ptr(_name)); \ _fail; \ @@ -371,7 +376,7 @@ _label: \ } else #define scoped_cond_guard(_name, _fail, args...) \ - __scoped_cond_guard(_name, _fail, __UNIQUE_ID(label), args) + __scoped_cond_guard(_name, _fail, __UNIQUE_ID(label), ARGC(args), ##args) /* * Additional helper macros for generating lock guards with types, either = for @@ -423,6 +428,27 @@ static inline class_##_name##_t class_##_name##_constr= uctor(void) \ return _t; \ } +#define __DEFINE_LOCK_GUARD(_name, _type, _lock) \ + static inline class_##_name##_t class_##_name##_constructor_x(void *l) { \ + class_##_name##_t _t =3D { .lock =3D (_type *)l }, \ + *_T __maybe_unused =3D &_t; \ + _lock; \ + return _t; \ + } \ + static inline class_##_name##_t class_##_name##_constructor(int argc, ...= ) { \ + BUILD_BUG_ON(argc > 1); \ + va_list args; \ + va_start(args, argc); \ + void *arg =3D argc ? va_arg(args, _type *) : (void *)8; \ + va_end(args); \ + return class_##_name##_constructor_x(arg); \ + } + +#define DEFINE_LOCK_GUARD(_name, _type, _lock, _unlock, ...) \ + __DEFINE_CLASS_IS_CONDITIONAL(_name, false); \ + __DEFINE_UNLOCK_GUARD(_name, _type, _unlock, __VA_ARGS__) \ + __DEFINE_LOCK_GUARD(_name, _type, _lock) + #define DEFINE_LOCK_GUARD_1(_name, _type, _lock, _unlock, ...) \ __DEFINE_CLASS_IS_CONDITIONAL(_name, false); \ __DEFINE_UNLOCK_GUARD(_name, _type, _unlock, __VA_ARGS__) \ -- 2.43.0