linux-block.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2] block: schedule queue restart after BLK_STS_ZONE_RESOURCE
@ 2021-10-26 16:51 Naohiro Aota
  2021-10-26 22:00 ` Jens Axboe
  0 siblings, 1 reply; 2+ messages in thread
From: Naohiro Aota @ 2021-10-26 16:51 UTC (permalink / raw)
  To: Jens Axboe
  Cc: linux-block, linux-kernel, Naohiro Aota, Christoph Hellwig,
	Niklas Cassel

When dispatching a zone append write request to a SCSI zoned block device,
if the target zone of the request is already locked, the device driver will
return BLK_STS_ZONE_RESOURCE and the request will be pushed back to the
hctx dipatch queue. The queue will be marked as RESTART in
dd_finish_request() and restarted in __blk_mq_free_request(). However, this
restart applies to the hctx of the completed request. If the requeued
request is on a different hctx, dispatch will no be retried until another
request is submitted or the next periodic queue run triggers, leading to up
to 30 seconds latency for the requeued request.

Fix this problem by scheduling a queue restart similarly to the
BLK_STS_RESOURCE case or when we cannot get the budget.

Also, consolidate the checks into the "need_resource" variable to simplify
the condition.

Signed-off-by: Naohiro Aota <naohiro.aota@wdc.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Cc: Niklas Cassel <Niklas.Cassel@wdc.com>
---
Changes from v1
- Rename need_resource to needs_resource to be consistent with
  needs_restart
- Use the if- to set needs_resource when prep == PREP_DISPATCH_NO_BUDGET.

 block/blk-mq.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/block/blk-mq.c b/block/blk-mq.c
index 9c64f0025a56..dc49483334c7 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -1318,6 +1318,7 @@ bool blk_mq_dispatch_rq_list(struct blk_mq_hw_ctx *hctx, struct list_head *list,
 	int errors, queued;
 	blk_status_t ret = BLK_STS_OK;
 	LIST_HEAD(zone_list);
+	bool needs_resource = false;
 
 	if (list_empty(list))
 		return false;
@@ -1363,6 +1364,8 @@ bool blk_mq_dispatch_rq_list(struct blk_mq_hw_ctx *hctx, struct list_head *list,
 			queued++;
 			break;
 		case BLK_STS_RESOURCE:
+			needs_resource = true;
+			fallthrough;
 		case BLK_STS_DEV_RESOURCE:
 			blk_mq_handle_dev_resource(rq, list);
 			goto out;
@@ -1373,6 +1376,7 @@ bool blk_mq_dispatch_rq_list(struct blk_mq_hw_ctx *hctx, struct list_head *list,
 			 * accept.
 			 */
 			blk_mq_handle_zone_resource(rq, &zone_list);
+			needs_resource = true;
 			break;
 		default:
 			errors++;
@@ -1399,7 +1403,6 @@ bool blk_mq_dispatch_rq_list(struct blk_mq_hw_ctx *hctx, struct list_head *list,
 		/* For non-shared tags, the RESTART check will suffice */
 		bool no_tag = prep == PREP_DISPATCH_NO_TAG &&
 			(hctx->flags & BLK_MQ_F_TAG_QUEUE_SHARED);
-		bool no_budget_avail = prep == PREP_DISPATCH_NO_BUDGET;
 
 		if (nr_budgets)
 			blk_mq_release_budgets(q, list);
@@ -1440,14 +1443,16 @@ bool blk_mq_dispatch_rq_list(struct blk_mq_hw_ctx *hctx, struct list_head *list,
 		 * If driver returns BLK_STS_RESOURCE and SCHED_RESTART
 		 * bit is set, run queue after a delay to avoid IO stalls
 		 * that could otherwise occur if the queue is idle.  We'll do
-		 * similar if we couldn't get budget and SCHED_RESTART is set.
+		 * similar if we couldn't get budget or couldn't lock a zone
+		 * and SCHED_RESTART is set.
 		 */
 		needs_restart = blk_mq_sched_needs_restart(hctx);
+		if (prep == PREP_DISPATCH_NO_BUDGET)
+			needs_resource = true;
 		if (!needs_restart ||
 		    (no_tag && list_empty_careful(&hctx->dispatch_wait.entry)))
 			blk_mq_run_hw_queue(hctx, true);
-		else if (needs_restart && (ret == BLK_STS_RESOURCE ||
-					   no_budget_avail))
+		else if (needs_restart && needs_resource)
 			blk_mq_delay_run_hw_queue(hctx, BLK_MQ_RESOURCE_DELAY);
 
 		blk_mq_update_dispatch_busy(hctx, true);
-- 
2.33.1


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH v2] block: schedule queue restart after BLK_STS_ZONE_RESOURCE
  2021-10-26 16:51 [PATCH v2] block: schedule queue restart after BLK_STS_ZONE_RESOURCE Naohiro Aota
@ 2021-10-26 22:00 ` Jens Axboe
  0 siblings, 0 replies; 2+ messages in thread
From: Jens Axboe @ 2021-10-26 22:00 UTC (permalink / raw)
  To: Naohiro Aota; +Cc: linux-block, linux-kernel, Christoph Hellwig, Niklas Cassel

On Wed, 27 Oct 2021 01:51:27 +0900, Naohiro Aota wrote:
> When dispatching a zone append write request to a SCSI zoned block device,
> if the target zone of the request is already locked, the device driver will
> return BLK_STS_ZONE_RESOURCE and the request will be pushed back to the
> hctx dipatch queue. The queue will be marked as RESTART in
> dd_finish_request() and restarted in __blk_mq_free_request(). However, this
> restart applies to the hctx of the completed request. If the requeued
> request is on a different hctx, dispatch will no be retried until another
> request is submitted or the next periodic queue run triggers, leading to up
> to 30 seconds latency for the requeued request.
> 
> [...]

Applied, thanks!

[1/1] block: schedule queue restart after BLK_STS_ZONE_RESOURCE
      commit: 9586e67b911c95ba158fcc247b230e9c2d718623

Best regards,
-- 
Jens Axboe



^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2021-10-26 22:01 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-10-26 16:51 [PATCH v2] block: schedule queue restart after BLK_STS_ZONE_RESOURCE Naohiro Aota
2021-10-26 22:00 ` Jens Axboe

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).