Skip to content

Commit

Permalink
blk-mq: fix blk_mq_all_tag_iter
Browse files Browse the repository at this point in the history
blk_mq_all_tag_iter() is added to iterate all requests, so we should
fetch the request from ->static_rqs][] instead of ->rqs[] which is for
holding in-flight request only.

Fix it by adding flag of BT_TAG_ITER_STATIC_RQS.

Fixes: bf0beec ("blk-mq: drain I/O when all CPUs in a hctx are offline")
Signed-off-by: Ming Lei <[email protected]>
Tested-by: John Garry <[email protected]>
Cc: Dongli Zhang <[email protected]>
Cc: Hannes Reinecke <[email protected]>
Cc: Daniel Wagner <[email protected]>
Cc: Christoph Hellwig <[email protected]>
Signed-off-by: Jens Axboe <[email protected]>
  • Loading branch information
Ming Lei authored and axboe committed Jun 7, 2020
1 parent d94ecfc commit 22f614b
Showing 1 changed file with 9 additions and 3 deletions.
12 changes: 9 additions & 3 deletions block/blk-mq-tag.c
Original file line number Diff line number Diff line change
Expand Up @@ -296,6 +296,7 @@ struct bt_tags_iter_data {

#define BT_TAG_ITER_RESERVED (1 << 0)
#define BT_TAG_ITER_STARTED (1 << 1)
#define BT_TAG_ITER_STATIC_RQS (1 << 2)

static bool bt_tags_iter(struct sbitmap *bitmap, unsigned int bitnr, void *data)
{
Expand All @@ -309,9 +310,12 @@ static bool bt_tags_iter(struct sbitmap *bitmap, unsigned int bitnr, void *data)

/*
* We can hit rq == NULL here, because the tagging functions
* test and set the bit before assining ->rqs[].
* test and set the bit before assigning ->rqs[].
*/
rq = tags->rqs[bitnr];
if (iter_data->flags & BT_TAG_ITER_STATIC_RQS)
rq = tags->static_rqs[bitnr];
else
rq = tags->rqs[bitnr];
if (!rq)
return true;
if ((iter_data->flags & BT_TAG_ITER_STARTED) &&
Expand Down Expand Up @@ -366,11 +370,13 @@ static void __blk_mq_all_tag_iter(struct blk_mq_tags *tags,
* indicates whether or not @rq is a reserved request. Return
* true to continue iterating tags, false to stop.
* @priv: Will be passed as second argument to @fn.
*
* Caller has to pass the tag map from which requests are allocated.
*/
void blk_mq_all_tag_iter(struct blk_mq_tags *tags, busy_tag_iter_fn *fn,
void *priv)
{
return __blk_mq_all_tag_iter(tags, fn, priv, 0);
return __blk_mq_all_tag_iter(tags, fn, priv, BT_TAG_ITER_STATIC_RQS);
}

/**
Expand Down

0 comments on commit 22f614b

Please sign in to comment.