Re: [PATCH v2 3/3] blk-mq: Optimise blk_mq_queue_tag_busy_iter() for shared tags

From: John Garry
Date: Mon Dec 06 2021 - 15:10:50 EST


On 06/12/2021 12:49, John Garry wrote:
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@xxxxxxxxxxxxxx/


Fixes: e155b0c238b2 ("blk-mq: Use shared tags for shared sbitmap support")

Signed-off-by: John Garry<john.garry@xxxxxxxxxx>
Reviewed-by: Hannes Reinecke<hare@xxxxxxx>
Reviewed-by: Ming Lei<ming.lei@xxxxxxxxxx>
Reported-and-tested-by: Kashyap Desai<kashyap.desai@xxxxxxxxxxxx>