six locks: Centralize setting of waiting bit
Originally, the waiting bit was always set by trylock() on failure: however, it's now set by __six_lock_type_slowpath(), with wait_lock held - which is the more correct place to do it. That made setting the waiting bit in trylock redundant, so this patch deletes that. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
0157f9c5a7
commit
d2c86b77de
@ -151,14 +151,6 @@ static int __do_six_trylock_type(struct six_lock *lock,
|
||||
atomic64_add(__SIX_VAL(write_locking, 1),
|
||||
&lock->state.counter);
|
||||
smp_mb__after_atomic();
|
||||
} else if (!(lock->state.waiters & (1 << SIX_LOCK_write))) {
|
||||
atomic64_add(__SIX_VAL(waiters, 1 << SIX_LOCK_write),
|
||||
&lock->state.counter);
|
||||
/*
|
||||
* pairs with barrier after unlock and before checking
|
||||
* for readers in unlock path
|
||||
*/
|
||||
smp_mb__after_atomic();
|
||||
}
|
||||
|
||||
ret = !pcpu_read_count(lock);
|
||||
@ -190,10 +182,9 @@ static int __do_six_trylock_type(struct six_lock *lock,
|
||||
|
||||
if (type == SIX_LOCK_write)
|
||||
new.write_locking = 0;
|
||||
} else if (!try && !(new.waiters & (1 << type)))
|
||||
new.waiters |= 1 << type;
|
||||
else
|
||||
break; /* waiting bit already set */
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
} while ((v = atomic64_cmpxchg_acquire(&lock->state.counter,
|
||||
old.v, new.v)) != old.v);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user