[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20251001102341.600251-1-pengyu@kylinos.cn>
Date: Wed, 1 Oct 2025 18:23:40 +0800
From: pengyu <pengyu@...inos.cn>
To: tj@...nel.org,
jiangshanlai@...il.com,
oliver.sang@...el.com
Cc: changlianzhi@...ontech.com,
dmitry.torokhov@...il.com,
gregkh@...uxfoundation.org,
jirislaby@...nel.org,
legion@...nel.org,
linux-kernel@...r.kernel.org,
linux-serial@...r.kernel.org,
lkp@...el.com,
mingo@...nel.org,
myrrhperiwinkle@...labs.xyz,
oe-lkp@...ts.linux.dev,
pengyu@...inos.cn,
syzbot+79c403850e6816dc39cf@...kaller.appspotmail.com,
tglx@...utronix.de
Subject: [PATCH v2 1/2] workqueue: Add initialization macro for work items that disabled by default
In certain scenarios, workqueue tasks that are disabled by default are
required. Similar to DECLARE_TASKLET_DISABLED, the DECLARE_WORK_DISABLED
macro is added to achieve this functionality.
Signed-off-by: pengyu <pengyu@...inos.cn>
---
include/linux/workqueue.h | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/include/linux/workqueue.h b/include/linux/workqueue.h
index 45d5dd470ff6..b6c72d59351b 100644
--- a/include/linux/workqueue.h
+++ b/include/linux/workqueue.h
@@ -102,6 +102,7 @@ enum wq_misc_consts {
/* Convenience constants - of type 'unsigned long', not 'enum'! */
#define WORK_OFFQ_BH (1ul << WORK_OFFQ_BH_BIT)
#define WORK_OFFQ_FLAG_MASK (((1ul << WORK_OFFQ_FLAG_BITS) - 1) << WORK_OFFQ_FLAG_SHIFT)
+#define WORK_OFFQ_DISABLED (1ul << WORK_OFFQ_DISABLE_SHIFT)
#define WORK_OFFQ_DISABLE_MASK (((1ul << WORK_OFFQ_DISABLE_BITS) - 1) << WORK_OFFQ_DISABLE_SHIFT)
#define WORK_OFFQ_POOL_NONE ((1ul << WORK_OFFQ_POOL_BITS) - 1)
#define WORK_STRUCT_NO_POOL (WORK_OFFQ_POOL_NONE << WORK_OFFQ_POOL_SHIFT)
@@ -110,6 +111,8 @@ enum wq_misc_consts {
#define WORK_DATA_INIT() ATOMIC_LONG_INIT((unsigned long)WORK_STRUCT_NO_POOL)
#define WORK_DATA_STATIC_INIT() \
ATOMIC_LONG_INIT((unsigned long)(WORK_STRUCT_NO_POOL | WORK_STRUCT_STATIC))
+#define WORK_DATA_DISABLED_INIT() \
+ ATOMIC_LONG_INIT((unsigned long)(WORK_STRUCT_NO_POOL | WORK_STRUCT_STATIC | WORK_OFFQ_DISABLED))
struct delayed_work {
struct work_struct work;
@@ -242,6 +245,13 @@ struct execute_work {
__WORK_INIT_LOCKDEP_MAP(#n, &(n)) \
}
+#define __WORK_DISABLED_INITIALIZER(n, f) { \
+ .data = WORK_DATA_DISABLED_INIT(), \
+ .entry = { &(n).entry, &(n).entry }, \
+ .func = (f), \
+ __WORK_INIT_LOCKDEP_MAP(#n, &(n)) \
+ }
+
#define __DELAYED_WORK_INITIALIZER(n, f, tflags) { \
.work = __WORK_INITIALIZER((n).work, (f)), \
.timer = __TIMER_INITIALIZER(delayed_work_timer_fn,\
@@ -251,6 +261,9 @@ struct execute_work {
#define DECLARE_WORK(n, f) \
struct work_struct n = __WORK_INITIALIZER(n, f)
+#define DECLARE_WORK_DISABLED(n, f) \
+ struct work_struct n = __WORK_DISABLED_INITIALIZER(n, f)
+
#define DECLARE_DELAYED_WORK(n, f) \
struct delayed_work n = __DELAYED_WORK_INITIALIZER(n, f, 0)
--
2.25.1
Powered by blists - more mailing lists