sbitmap: optimize wakeup check
authorJens Axboe <axboe@kernel.dk>
Fri, 30 Nov 2018 00:36:41 +0000 (17:36 -0700)
committerJens Axboe <axboe@kernel.dk>
Fri, 30 Nov 2018 21:48:04 +0000 (14:48 -0700)
commit5d2ee7122c73be6a3b6bfe90d237e8aed737cfaa
treeada2bd06a0523a6ab8a9eae652034e2b0cb7b996
parentea86ea2cdced20057da4d2c32965c1219c238197
sbitmap: optimize wakeup check

Even if we have no waiters on any of the sbitmap_queue wait states, we
still have to loop every entry to check. We do this for every IO, so
the cost adds up.

Shift a bit of the cost to the slow path, when we actually have waiters.
Wrap prepare_to_wait_exclusive() and finish_wait(), so we can maintain
an internal count of how many are currently active. Then we can simply
check this count in sbq_wake_ptr() and not have to loop if we don't
have any sleepers.

Convert the two users of sbitmap with waiting, blk-mq-tag and iSCSI.

Reviewed-by: Omar Sandoval <osandov@fb.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-mq-tag.c
drivers/target/iscsi/iscsi_target_util.c
include/linux/sbitmap.h
lib/sbitmap.c