sbitmap: Replace cmpxchg with xchg
cmpxchg() with an immediate value could be replaced with less expensive xchg(). The same true if new value don't _depend_ on the old one. In the second block, atomic_cmpxchg() return value isn't checked, so after atomic_cmpxchg() -> atomic_xchg() conversion it could be replaced with atomic_set(). Comparison with atomic_read() in the second chunk was left as an optimisation (if that was the initial intention). Reviewed-by: Omar Sandoval <osandov@fb.com> Signed-off-by: Pavel Begunkov <asml.silence@gmail.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
79d08f89bb
commit
417232880c
@ -26,9 +26,7 @@ static inline bool sbitmap_deferred_clear(struct sbitmap *sb, int index)
|
||||
/*
|
||||
* First get a stable cleared mask, setting the old mask to 0.
|
||||
*/
|
||||
do {
|
||||
mask = sb->map[index].cleared;
|
||||
} while (cmpxchg(&sb->map[index].cleared, mask, 0) != mask);
|
||||
mask = xchg(&sb->map[index].cleared, 0);
|
||||
|
||||
/*
|
||||
* Now clear the masked bits in our free word
|
||||
@ -516,10 +514,8 @@ static struct sbq_wait_state *sbq_wake_ptr(struct sbitmap_queue *sbq)
|
||||
struct sbq_wait_state *ws = &sbq->ws[wake_index];
|
||||
|
||||
if (waitqueue_active(&ws->wait)) {
|
||||
int o = atomic_read(&sbq->wake_index);
|
||||
|
||||
if (wake_index != o)
|
||||
atomic_cmpxchg(&sbq->wake_index, o, wake_index);
|
||||
if (wake_index != atomic_read(&sbq->wake_index))
|
||||
atomic_set(&sbq->wake_index, wake_index);
|
||||
return ws;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user