The static rwsem initializers rely on persistent lockdep class keys, both for their own maps and for embedded locks or wait queues.
Enforce static storage in DECLARE_RWSEM(), including PREEMPT_RT, and in __DEFINE_PERCPU_RWSEM(), covering both public per-CPU rwsem declarations. Automatic objects must use init_rwsem() or percpu_init_rwsem(). Assisted-by: OpenAI Codex Signed-off-by: Yury Norov <[email protected]> --- include/linux/percpu-rwsem.h | 4 +++- include/linux/rwsem.h | 7 +++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/include/linux/percpu-rwsem.h b/include/linux/percpu-rwsem.h index 39d5bf8e6562..680c3efc14c8 100644 --- a/include/linux/percpu-rwsem.h +++ b/include/linux/percpu-rwsem.h @@ -2,6 +2,7 @@ #ifndef _LINUX_PERCPU_RWSEM_H #define _LINUX_PERCPU_RWSEM_H +#include <linux/compiler.h> #include <linux/atomic.h> #include <linux/percpu.h> #include <linux/rcuwait.h> @@ -36,7 +37,8 @@ is_static struct percpu_rw_semaphore name = { \ .waiters = __WAIT_QUEUE_HEAD_INITIALIZER(name.waiters), \ .block = ATOMIC_INIT(0), \ __PERCPU_RWSEM_DEP_MAP_INIT(name) \ -} +}; \ + ASSERT_STATIC_STORAGE(name) #define DEFINE_PERCPU_RWSEM(name) \ __DEFINE_PERCPU_RWSEM(name, /* not static */) diff --git a/include/linux/rwsem.h b/include/linux/rwsem.h index 6a1a7bae5f81..faf52c0c8dd3 100644 --- a/include/linux/rwsem.h +++ b/include/linux/rwsem.h @@ -8,6 +8,7 @@ #ifndef _LINUX_RWSEM_H #define _LINUX_RWSEM_H +#include <linux/compiler.h> #include <linux/linkage.h> #include <linux/types.h> @@ -111,7 +112,8 @@ static inline void rwsem_assert_held_write_nolockdep(const struct rw_semaphore * __RWSEM_DEP_MAP_INIT(name) } #define DECLARE_RWSEM(name) \ - struct rw_semaphore name = __RWSEM_INITIALIZER(name) + struct rw_semaphore name = __RWSEM_INITIALIZER(name); \ + ASSERT_STATIC_STORAGE(name) extern void __init_rwsem(struct rw_semaphore *sem, const char *name, struct lock_class_key *key); @@ -164,7 +166,8 @@ context_lock_struct(rw_semaphore) { } #define DECLARE_RWSEM(lockname) \ - struct rw_semaphore lockname = __RWSEM_INITIALIZER(lockname) + struct rw_semaphore lockname = __RWSEM_INITIALIZER(lockname); \ + ASSERT_STATIC_STORAGE(lockname) extern void __init_rwsem(struct rw_semaphore *rwsem, const char *name, struct lock_class_key *key); -- 2.53.0
