mirror of
https://github.com/torvalds/linux.git
synced 2026-03-08 03:24:45 +01:00
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
10 changed files with 2 additions and 22 deletions
|
|
@ -87,13 +87,11 @@ do { \
|
|||
0, LD_WAIT_CONFIG, LD_WAIT_INV, \
|
||||
LD_LOCK_PERCPU); \
|
||||
local_lock_debug_init(lock); \
|
||||
__assume_ctx_lock(lock); \
|
||||
} while (0)
|
||||
|
||||
#define __local_trylock_init(lock) \
|
||||
do { \
|
||||
__local_lock_init((local_lock_t *)lock); \
|
||||
__assume_ctx_lock(lock); \
|
||||
} while (0)
|
||||
|
||||
#define __spinlock_nested_bh_init(lock) \
|
||||
|
|
@ -105,7 +103,6 @@ do { \
|
|||
0, LD_WAIT_CONFIG, LD_WAIT_INV, \
|
||||
LD_LOCK_NORMAL); \
|
||||
local_lock_debug_init(lock); \
|
||||
__assume_ctx_lock(lock); \
|
||||
} while (0)
|
||||
|
||||
#define __local_lock_acquire(lock) \
|
||||
|
|
|
|||
|
|
@ -62,7 +62,6 @@ do { \
|
|||
static struct lock_class_key __key; \
|
||||
\
|
||||
__mutex_init((mutex), #mutex, &__key); \
|
||||
__assume_ctx_lock(mutex); \
|
||||
} while (0)
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -22,11 +22,10 @@ do { \
|
|||
static struct lock_class_key __key; \
|
||||
\
|
||||
__rwlock_init((lock), #lock, &__key); \
|
||||
__assume_ctx_lock(lock); \
|
||||
} while (0)
|
||||
#else
|
||||
# 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
|
||||
|
||||
#ifdef CONFIG_DEBUG_SPINLOCK
|
||||
|
|
|
|||
|
|
@ -22,7 +22,6 @@ do { \
|
|||
\
|
||||
init_rwbase_rt(&(rwl)->rwbase); \
|
||||
__rt_rwlock_init(rwl, #rwl, &__key); \
|
||||
__assume_ctx_lock(rwl); \
|
||||
} while (0)
|
||||
|
||||
extern void rt_read_lock(rwlock_t *rwlock) __acquires_shared(rwlock);
|
||||
|
|
|
|||
|
|
@ -121,7 +121,6 @@ do { \
|
|||
static struct lock_class_key __key; \
|
||||
\
|
||||
__init_rwsem((sem), #sem, &__key); \
|
||||
__assume_ctx_lock(sem); \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
|
|
@ -175,7 +174,6 @@ do { \
|
|||
static struct lock_class_key __key; \
|
||||
\
|
||||
__init_rwsem((sem), #sem, &__key); \
|
||||
__assume_ctx_lock(sem); \
|
||||
} while (0)
|
||||
|
||||
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 { \
|
||||
spin_lock_init(&(sl)->lock); \
|
||||
seqcount_spinlock_init(&(sl)->seqcount, &(sl)->lock); \
|
||||
__assume_ctx_lock(sl); \
|
||||
} while (0)
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -106,12 +106,11 @@ do { \
|
|||
static struct lock_class_key __key; \
|
||||
\
|
||||
__raw_spin_lock_init((lock), #lock, &__key, LD_WAIT_SPIN); \
|
||||
__assume_ctx_lock(lock); \
|
||||
} while (0)
|
||||
|
||||
#else
|
||||
# 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
|
||||
|
||||
#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), \
|
||||
#lock, &__key, LD_WAIT_CONFIG); \
|
||||
__assume_ctx_lock(lock); \
|
||||
} while (0)
|
||||
|
||||
#else
|
||||
|
|
@ -333,7 +331,6 @@ do { \
|
|||
do { \
|
||||
spinlock_check(_lock); \
|
||||
*(_lock) = __SPIN_LOCK_UNLOCKED(_lock); \
|
||||
__assume_ctx_lock(_lock); \
|
||||
} while (0)
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -20,7 +20,6 @@ static inline void __rt_spin_lock_init(spinlock_t *lock, const char *name,
|
|||
do { \
|
||||
rt_mutex_base_init(&(slock)->lock); \
|
||||
__rt_spin_lock_init(slock, name, key, percpu); \
|
||||
__assume_ctx_lock(slock); \
|
||||
} while (0)
|
||||
|
||||
#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,
|
||||
struct ww_class *ww_class)
|
||||
__assumes_ctx_lock(lock)
|
||||
{
|
||||
ww_mutex_base_init(&lock->base, ww_class->mutex_name, &ww_class->mutex_key);
|
||||
lock->ctx = NULL;
|
||||
|
|
|
|||
|
|
@ -542,12 +542,6 @@ struct test_ww_mutex_data {
|
|||
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)
|
||||
{
|
||||
if (!ww_mutex_lock(&d->mtx, NULL)) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue