Static work initializers use the work address as a lockdep class key and
mark the work item static for debugobjects. Automatic objects require
on-stack initialization instead.

Apply ASSERT_STATIC_STORAGE() to DECLARE_WORK(), DECLARE_DELAYED_WORK()
and DECLARE_DEFERRABLE_WORK(). Automatic objects must use the matching
INIT_*_ONSTACK() API and destroy the on-stack debugobjects before leaving
scope. Keep the underlying initializers available for embedded objects.

Assisted-by: OpenAI Codex
Signed-off-by: Yury Norov <[email protected]>
---
 include/linux/workqueue.h | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/include/linux/workqueue.h b/include/linux/workqueue.h
index c8a36423cb34..433c9801d9c5 100644
--- a/include/linux/workqueue.h
+++ b/include/linux/workqueue.h
@@ -6,6 +6,7 @@
 #ifndef _LINUX_WORKQUEUE_H
 #define _LINUX_WORKQUEUE_H
 
+#include <linux/compiler.h>
 #include <linux/alloc_tag.h>
 #include <linux/timer.h>
 #include <linux/linkage.h>
@@ -250,13 +251,16 @@ struct execute_work {
        }
 
 #define DECLARE_WORK(n, f)                                             \
-       struct work_struct n = __WORK_INITIALIZER(n, f)
+       struct work_struct n = __WORK_INITIALIZER(n, f);                \
+       ASSERT_STATIC_STORAGE(n)
 
 #define DECLARE_DELAYED_WORK(n, f)                                     \
-       struct delayed_work n = __DELAYED_WORK_INITIALIZER(n, f, 0)
+       struct delayed_work n = __DELAYED_WORK_INITIALIZER(n, f, 0);    \
+       ASSERT_STATIC_STORAGE(n)
 
 #define DECLARE_DEFERRABLE_WORK(n, f)                                  \
-       struct delayed_work n = __DELAYED_WORK_INITIALIZER(n, f, 
TIMER_DEFERRABLE)
+       struct delayed_work n = __DELAYED_WORK_INITIALIZER(n, f, 
TIMER_DEFERRABLE);     \
+       ASSERT_STATIC_STORAGE(n)
 
 #ifdef CONFIG_DEBUG_OBJECTS_WORK
 extern void __init_work(struct work_struct *work, int onstack);
-- 
2.53.0


Reply via email to