[PATCH 04/17] locking/semaphore: assert static storage for DEFINE_SEMAPHORE()

From: Yury Norov

Date: Mon Sep 14 2026 - 23:09:24 EST


DEFINE_SEMAPHORE() statically initializes its embedded raw spinlock.
Using it for an automatic local semaphore leaves lockdep without a
persistent class key.

Reject this use with ASSERT_STATIC_STORAGE(). Automatic semaphores must
use sema_init(), which supplies a static class key. Preserve the underlying
initializer used by sema_init() and by embedded objects.

Assisted-by: OpenAI Codex
Signed-off-by: Yury Norov <ynorov@xxxxxxxxxx>
---
include/linux/semaphore.h | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/include/linux/semaphore.h b/include/linux/semaphore.h
index a4c8651ef021..c0657a6aeb12 100644
--- a/include/linux/semaphore.h
+++ b/include/linux/semaphore.h
@@ -8,6 +8,7 @@
#ifndef __LINUX_SEMAPHORE_H
#define __LINUX_SEMAPHORE_H

+#include <linux/compiler.h>
#include <linux/list.h>
#include <linux/spinlock.h>

@@ -44,7 +45,8 @@ struct semaphore {
* context.
*/
#define DEFINE_SEMAPHORE(_name, _n) \
- struct semaphore _name = __SEMAPHORE_INITIALIZER(_name, _n)
+ struct semaphore _name = __SEMAPHORE_INITIALIZER(_name, _n); \
+ ASSERT_STATIC_STORAGE(_name)

static inline void sema_init(struct semaphore *sem, int val)
{
--
2.53.0