mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 22:21:40 +00:00
bcachefs: six locks: Fix lost wakeup
In percpu reader mode, trylock() for read had a lost wakeup: on failure to get the lock, we may have caused a writer to fail to get the lock, because we temporarily elevated the reader count. We need to check for waiters after decrementing the read count - not before. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
62d73dfc44
commit
61b85cb0d7
@ -163,8 +163,11 @@ static int __do_six_trylock(struct six_lock *lock, enum six_lock_type type,
|
||||
this_cpu_sub(*lock->readers, !ret);
|
||||
preempt_enable();
|
||||
|
||||
if (!ret && (old & SIX_LOCK_WAITING_write))
|
||||
if (!ret) {
|
||||
smp_mb();
|
||||
if (atomic_read(&lock->state) & SIX_LOCK_WAITING_write)
|
||||
ret = -1 - SIX_LOCK_write;
|
||||
}
|
||||
} else if (type == SIX_LOCK_write && lock->readers) {
|
||||
if (try) {
|
||||
atomic_add(SIX_LOCK_HELD_write, &lock->state);
|
||||
|
Loading…
Reference in New Issue
Block a user