compiler-context-analysis: Remove __assume_ctx_lock from initializers

Remove __assume_ctx_lock() from lock initializers.

Implicitly asserting an active context during initialization caused
false-positive double-lock errors when acquiring a lock immediately after its
initialization. Moving forward, guarded member initialization must either:

	1. Use guard(type_init)(&lock) or scoped_guard(type_init, ...).
	2. Use context_unsafe() for simple initialization.

Reported-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Marco Elver <elver@google.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lore.kernel.org/all/57062131-e79e-42c2-aa0b-8f931cb8cac2@acm.org/
Link: https://patch.msgid.link/20260119094029.1344361-7-elver@google.com
This commit is contained in:
Marco Elver 2026-01-19 10:05:56 +01:00 committed by Peter Zijlstra
parent 41539433b3
commit b682b70d01
10 changed files with 2 additions and 22 deletions

View File

@ -87,13 +87,11 @@ do { \
0, LD_WAIT_CONFIG, LD_WAIT_INV, \ 0, LD_WAIT_CONFIG, LD_WAIT_INV, \
LD_LOCK_PERCPU); \ LD_LOCK_PERCPU); \
local_lock_debug_init(lock); \ local_lock_debug_init(lock); \
__assume_ctx_lock(lock); \
} while (0) } while (0)
#define __local_trylock_init(lock) \ #define __local_trylock_init(lock) \
do { \ do { \
__local_lock_init((local_lock_t *)lock); \ __local_lock_init((local_lock_t *)lock); \
__assume_ctx_lock(lock); \
} while (0) } while (0)
#define __spinlock_nested_bh_init(lock) \ #define __spinlock_nested_bh_init(lock) \
@ -105,7 +103,6 @@ do { \
0, LD_WAIT_CONFIG, LD_WAIT_INV, \ 0, LD_WAIT_CONFIG, LD_WAIT_INV, \
LD_LOCK_NORMAL); \ LD_LOCK_NORMAL); \
local_lock_debug_init(lock); \ local_lock_debug_init(lock); \
__assume_ctx_lock(lock); \
} while (0) } while (0)
#define __local_lock_acquire(lock) \ #define __local_lock_acquire(lock) \

View File

@ -62,7 +62,6 @@ do { \
static struct lock_class_key __key; \ static struct lock_class_key __key; \
\ \
__mutex_init((mutex), #mutex, &__key); \ __mutex_init((mutex), #mutex, &__key); \
__assume_ctx_lock(mutex); \
} while (0) } while (0)
/** /**

View File

@ -22,11 +22,10 @@ do { \
static struct lock_class_key __key; \ static struct lock_class_key __key; \
\ \
__rwlock_init((lock), #lock, &__key); \ __rwlock_init((lock), #lock, &__key); \
__assume_ctx_lock(lock); \
} while (0) } while (0)
#else #else
# define rwlock_init(lock) \ # define rwlock_init(lock) \
do { *(lock) = __RW_LOCK_UNLOCKED(lock); __assume_ctx_lock(lock); } while (0) do { *(lock) = __RW_LOCK_UNLOCKED(lock); } while (0)
#endif #endif
#ifdef CONFIG_DEBUG_SPINLOCK #ifdef CONFIG_DEBUG_SPINLOCK

View File

@ -22,7 +22,6 @@ do { \
\ \
init_rwbase_rt(&(rwl)->rwbase); \ init_rwbase_rt(&(rwl)->rwbase); \
__rt_rwlock_init(rwl, #rwl, &__key); \ __rt_rwlock_init(rwl, #rwl, &__key); \
__assume_ctx_lock(rwl); \
} while (0) } while (0)
extern void rt_read_lock(rwlock_t *rwlock) __acquires_shared(rwlock); extern void rt_read_lock(rwlock_t *rwlock) __acquires_shared(rwlock);

View File

@ -121,7 +121,6 @@ do { \
static struct lock_class_key __key; \ static struct lock_class_key __key; \
\ \
__init_rwsem((sem), #sem, &__key); \ __init_rwsem((sem), #sem, &__key); \
__assume_ctx_lock(sem); \
} while (0) } while (0)
/* /*
@ -175,7 +174,6 @@ do { \
static struct lock_class_key __key; \ static struct lock_class_key __key; \
\ \
__init_rwsem((sem), #sem, &__key); \ __init_rwsem((sem), #sem, &__key); \
__assume_ctx_lock(sem); \
} while (0) } while (0)
static __always_inline int rwsem_is_locked(const struct rw_semaphore *sem) static __always_inline int rwsem_is_locked(const struct rw_semaphore *sem)

View File

@ -817,7 +817,6 @@ static __always_inline void write_seqcount_latch_end(seqcount_latch_t *s)
do { \ do { \
spin_lock_init(&(sl)->lock); \ spin_lock_init(&(sl)->lock); \
seqcount_spinlock_init(&(sl)->seqcount, &(sl)->lock); \ seqcount_spinlock_init(&(sl)->seqcount, &(sl)->lock); \
__assume_ctx_lock(sl); \
} while (0) } while (0)
/** /**

View File

@ -106,12 +106,11 @@ do { \
static struct lock_class_key __key; \ static struct lock_class_key __key; \
\ \
__raw_spin_lock_init((lock), #lock, &__key, LD_WAIT_SPIN); \ __raw_spin_lock_init((lock), #lock, &__key, LD_WAIT_SPIN); \
__assume_ctx_lock(lock); \
} while (0) } while (0)
#else #else
# define raw_spin_lock_init(lock) \ # define raw_spin_lock_init(lock) \
do { *(lock) = __RAW_SPIN_LOCK_UNLOCKED(lock); __assume_ctx_lock(lock); } while (0) do { *(lock) = __RAW_SPIN_LOCK_UNLOCKED(lock); } while (0)
#endif #endif
#define raw_spin_is_locked(lock) arch_spin_is_locked(&(lock)->raw_lock) #define raw_spin_is_locked(lock) arch_spin_is_locked(&(lock)->raw_lock)
@ -324,7 +323,6 @@ do { \
\ \
__raw_spin_lock_init(spinlock_check(lock), \ __raw_spin_lock_init(spinlock_check(lock), \
#lock, &__key, LD_WAIT_CONFIG); \ #lock, &__key, LD_WAIT_CONFIG); \
__assume_ctx_lock(lock); \
} while (0) } while (0)
#else #else
@ -333,7 +331,6 @@ do { \
do { \ do { \
spinlock_check(_lock); \ spinlock_check(_lock); \
*(_lock) = __SPIN_LOCK_UNLOCKED(_lock); \ *(_lock) = __SPIN_LOCK_UNLOCKED(_lock); \
__assume_ctx_lock(_lock); \
} while (0) } while (0)
#endif #endif

View File

@ -20,7 +20,6 @@ static inline void __rt_spin_lock_init(spinlock_t *lock, const char *name,
do { \ do { \
rt_mutex_base_init(&(slock)->lock); \ rt_mutex_base_init(&(slock)->lock); \
__rt_spin_lock_init(slock, name, key, percpu); \ __rt_spin_lock_init(slock, name, key, percpu); \
__assume_ctx_lock(slock); \
} while (0) } while (0)
#define _spin_lock_init(slock, percpu) \ #define _spin_lock_init(slock, percpu) \

View File

@ -107,7 +107,6 @@ context_lock_struct(ww_acquire_ctx) {
*/ */
static inline void ww_mutex_init(struct ww_mutex *lock, static inline void ww_mutex_init(struct ww_mutex *lock,
struct ww_class *ww_class) struct ww_class *ww_class)
__assumes_ctx_lock(lock)
{ {
ww_mutex_base_init(&lock->base, ww_class->mutex_name, &ww_class->mutex_key); ww_mutex_base_init(&lock->base, ww_class->mutex_name, &ww_class->mutex_key);
lock->ctx = NULL; lock->ctx = NULL;

View File

@ -542,12 +542,6 @@ struct test_ww_mutex_data {
int counter __guarded_by(&mtx); int counter __guarded_by(&mtx);
}; };
static void __used test_ww_mutex_init(struct test_ww_mutex_data *d)
{
ww_mutex_init(&d->mtx, &ww_class);
d->counter = 0;
}
static void __used test_ww_mutex_lock_noctx(struct test_ww_mutex_data *d) static void __used test_ww_mutex_lock_noctx(struct test_ww_mutex_data *d)
{ {
if (!ww_mutex_lock(&d->mtx, NULL)) { if (!ww_mutex_lock(&d->mtx, NULL)) {