Commit 41723288 authored by Pavel Begunkov's avatar Pavel Begunkov Committed by Jens Axboe
Browse files

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: default avatarOmar Sandoval <osandov@fb.com>
Signed-off-by: default avatarPavel Begunkov <asml.silence@gmail.com>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 79d08f89
Loading
Loading
Loading
Loading
+3 −7
Original line number Diff line number Diff line
@@ -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;
		}