forked from Minki/linux
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.
|
* First get a stable cleared mask, setting the old mask to 0.
|
||||||
*/
|
*/
|
||||||
do {
|
mask = xchg(&sb->map[index].cleared, 0);
|
||||||
mask = sb->map[index].cleared;
|
|
||||||
} while (cmpxchg(&sb->map[index].cleared, mask, 0) != mask);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Now clear the masked bits in our free word
|
* 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];
|
struct sbq_wait_state *ws = &sbq->ws[wake_index];
|
||||||
|
|
||||||
if (waitqueue_active(&ws->wait)) {
|
if (waitqueue_active(&ws->wait)) {
|
||||||
int o = atomic_read(&sbq->wake_index);
|
if (wake_index != atomic_read(&sbq->wake_index))
|
||||||
|
atomic_set(&sbq->wake_index, wake_index);
|
||||||
if (wake_index != o)
|
|
||||||
atomic_cmpxchg(&sbq->wake_index, o, wake_index);
|
|
||||||
return ws;
|
return ws;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user