| From f2b9f3995bbb9441092d1e577766bb8f36f9357f Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 6 Oct 2020 15:41:25 -0400 |
| Subject: block: Consider only dispatched requests for inflight statistic |
| |
| From: Gabriel Krisman Bertazi <krisman@collabora.com> |
| |
| [ Upstream commit a926c7afffcc0f2e35e6acbccb16921bacf34617 ] |
| |
| According to Documentation/block/stat.rst, inflight should not include |
| I/O requests that are in the queue but not yet dispatched to the device, |
| but blk-mq identifies as inflight any request that has a tag allocated, |
| which, for queues without elevator, happens at request allocation time |
| and before it is queued in the ctx (default case in blk_mq_submit_bio). |
| |
| In addition, current behavior is different for queues with elevator from |
| queues without it, since for the former the driver tag is allocated at |
| dispatch time. A more precise approach would be to only consider |
| requests with state MQ_RQ_IN_FLIGHT. |
| |
| This effectively reverts commit 6131837b1de6 ("blk-mq: count allocated |
| but not started requests in iostats inflight") to consolidate blk-mq |
| behavior with itself (elevator case) and with original documentation, |
| but it differs from the behavior used by the legacy path. |
| |
| This version differs from v1 by using blk_mq_rq_state to access the |
| state attribute. Avoid using blk_mq_request_started, which was |
| suggested, since we don't want to include MQ_RQ_COMPLETE. |
| |
| Signed-off-by: Gabriel Krisman Bertazi <krisman@collabora.com> |
| Cc: Omar Sandoval <osandov@fb.com> |
| Signed-off-by: Jens Axboe <axboe@kernel.dk> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| block/blk-mq.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| diff --git a/block/blk-mq.c b/block/blk-mq.c |
| index 94a53d779c12b..ca2fdb58e7af5 100644 |
| --- a/block/blk-mq.c |
| +++ b/block/blk-mq.c |
| @@ -105,7 +105,7 @@ static bool blk_mq_check_inflight(struct blk_mq_hw_ctx *hctx, |
| { |
| struct mq_inflight *mi = priv; |
| |
| - if (rq->part == mi->part) |
| + if (rq->part == mi->part && blk_mq_rq_state(rq) == MQ_RQ_IN_FLIGHT) |
| mi->inflight[rq_data_dir(rq)]++; |
| |
| return true; |
| -- |
| 2.27.0 |
| |