]> git.baikalelectronics.ru Git - kernel.git/commit
blk-mq: Optimise blk_mq_queue_tag_busy_iter() for shared tags
authorJohn Garry <john.garry@huawei.com>
Mon, 6 Dec 2021 12:49:50 +0000 (20:49 +0800)
committerJens Axboe <axboe@kernel.dk>
Mon, 6 Dec 2021 20:18:47 +0000 (13:18 -0700)
commitec361ab0096838deeda05dee6572b498e8593b09
tree9b6a3ec4a9f1bd0d812b2bdf07b8598e051aeec6
parent5fbfbb1cdaeedc1c260e883b480d41e9f8b3006d
blk-mq: Optimise blk_mq_queue_tag_busy_iter() for shared tags

Kashyap reports high CPU usage in blk_mq_queue_tag_busy_iter() and callees
using megaraid SAS RAID card since moving to shared tags [0].

Previously, when shared tags was shared sbitmap, this function was less
than optimum since we would iter through all tags for all hctx's,
yet only ever match upto tagset depth number of rqs.

Since the change to shared tags, things are even less efficient if we have
parallel callers of blk_mq_queue_tag_busy_iter(). This is because in
bt_iter() -> blk_mq_find_and_get_req() there would be more contention on
accessing each request ref and tags->lock since they are now shared among
all HW queues.

Optimise by having separate calls to bt_for_each() for when we're using
shared tags. In this case no longer pass a hctx, as it is no longer
relevant, and teach bt_iter() about this.

Ming suggested something along the lines of this change, apart from a
different implementation.

[0] https://lore.kernel.org/linux-block/e4e92abbe9d52bcba6b8cc6c91c442cc@mail.gmail.com/

Signed-off-by: John Garry <john.garry@huawei.com>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Ming Lei <ming.lei@redhat.com>
Reported-and-tested-by: Kashyap Desai <kashyap.desai@broadcom.com>
Fixes: 8537c9eeb586 ("blk-mq: Use shared tags for shared sbitmap support")
Link: https://lore.kernel.org/r/1638794990-137490-4-git-send-email-john.garry@huawei.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-mq-tag.c