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:
parent
41539433b3
commit
b682b70d01
|
|
@ -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) \
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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) \
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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)) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue