On Fri, Nov 30, 2018 at 09:01:18AM -0700, Jens Axboe wrote: > 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@xxxxxx> > Signed-off-by: Jens Axboe <axboe@xxxxxxxxx> > --- > block/blk-mq-tag.c | 11 ++++---- > drivers/target/iscsi/iscsi_target_util.c | 12 +++++---- > include/linux/sbitmap.h | 34 ++++++++++++++++++++++++ > lib/sbitmap.c | 28 +++++++++++++++++++ > 4 files changed, 74 insertions(+), 11 deletions(-)