linux-block.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Ming Lei <ming.lei@redhat.com>
To: Jens Axboe <axboe@kernel.dk>
Cc: linux-block@vger.kernel.org, Ming Lei <ming.lei@redhat.com>,
	John Garry <john.garry@huawei.com>,
	Bart Van Assche <bvanassche@acm.org>,
	Hannes Reinecke <hare@suse.com>, Christoph Hellwig <hch@lst.de>,
	Thomas Gleixner <tglx@linutronix.de>
Subject: [PATCH V11 10/12] block: add request allocation flag of BLK_MQ_REQ_FORCE
Date: Wed, 13 May 2020 11:48:01 +0800	[thread overview]
Message-ID: <20200513034803.1844579-11-ming.lei@redhat.com> (raw)
In-Reply-To: <20200513034803.1844579-1-ming.lei@redhat.com>

When one hctx becomes inactive, there may be requests allocated from
this hctx, we can't queue them to the inactive hctx, one approach is
to re-submit them via one active hctx.

However, the request queue may have been started to freeze, and allocating
request becomes not possible. Add flag of BLK_MQ_REQ_FORCE to allow block
layer to allocate request in this case becasue the queue won't be frozen
completely before all requests allocated from inactive hctx are completed.

The similar approach has been applied in commit 8dc765d438f1 ("SCSI: fix queue
cleanup race before queue initialization is done").

This way can help on other request dependency case too, such as, storage
device side has some problem, and IO request can't be queued to device
successfully, and passthrough request is required to fix the device problem.
If queue freeze just comes before allocating passthrough request, hang will be
triggered in queue freeze process, IO process and context for allocating
passthrough request forever. See commit 01e99aeca397 ("blk-mq: insert passthrough
request into hctx->dispatch directly") for background of this kind of issue.

Cc: John Garry <john.garry@huawei.com>
Cc: Bart Van Assche <bvanassche@acm.org>
Cc: Hannes Reinecke <hare@suse.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ming Lei <ming.lei@redhat.com>
---
 block/blk-core.c       | 5 +++++
 include/linux/blk-mq.h | 7 +++++++
 2 files changed, 12 insertions(+)

diff --git a/block/blk-core.c b/block/blk-core.c
index ffb1579fd4da..82be15c1fde4 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -430,6 +430,11 @@ int blk_queue_enter(struct request_queue *q, blk_mq_req_flags_t flags)
 		if (success)
 			return 0;
 
+		if (flags & BLK_MQ_REQ_FORCE) {
+			percpu_ref_get(&q->q_usage_counter);
+			return 0;
+		}
+
 		if (flags & BLK_MQ_REQ_NOWAIT)
 			return -EBUSY;
 
diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h
index c2ea0a6e5b56..7d7aa5305a67 100644
--- a/include/linux/blk-mq.h
+++ b/include/linux/blk-mq.h
@@ -448,6 +448,13 @@ enum {
 	BLK_MQ_REQ_INTERNAL	= (__force blk_mq_req_flags_t)(1 << 2),
 	/* set RQF_PREEMPT */
 	BLK_MQ_REQ_PREEMPT	= (__force blk_mq_req_flags_t)(1 << 3),
+
+	/*
+	 * force to allocate request and caller has to make sure queue
+	 * won't be frozen completely during allocation, and this flag
+	 * is only applied after queue freeze is started
+	 */
+	BLK_MQ_REQ_FORCE	= (__force blk_mq_req_flags_t)(1 << 4),
 };
 
 struct request *blk_mq_alloc_request(struct request_queue *q, unsigned int op,
-- 
2.25.2


  parent reply	other threads:[~2020-05-13  3:49 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-05-13  3:47 [PATCH V11 00/12] blk-mq: improvement CPU hotplug Ming Lei
2020-05-13  3:47 ` [PATCH V11 01/12] block: clone nr_integrity_segments and write_hint in blk_rq_prep_clone Ming Lei
2020-05-13  3:47 ` [PATCH V11 02/12] block: add helper for copying request Ming Lei
2020-05-13  3:47 ` [PATCH V11 03/12] blk-mq: mark blk_mq_get_driver_tag as static Ming Lei
2020-05-13  3:47 ` [PATCH V11 04/12] blk-mq: assign rq->tag in blk_mq_get_driver_tag Ming Lei
2020-05-13  3:47 ` [PATCH V11 05/12] blk-mq: add blk_mq_all_tag_iter Ming Lei
2020-05-13 11:56   ` Christoph Hellwig
2020-05-13  3:47 ` [PATCH V11 06/12] blk-mq: prepare for draining IO when hctx's all CPUs are offline Ming Lei
2020-05-13  6:35   ` Hannes Reinecke
2020-05-13 11:58   ` Christoph Hellwig
2020-05-14  0:33     ` Ming Lei
2020-05-13  3:47 ` [PATCH V11 07/12] blk-mq: stop to handle IO and drain IO before hctx becomes inactive Ming Lei
2020-05-13 11:59   ` Christoph Hellwig
2020-05-14  0:36     ` Ming Lei
2020-05-14  1:12     ` Bart Van Assche
2020-05-14  3:10     ` Ming Lei
2020-05-13  3:47 ` [PATCH V11 08/12] block: add blk_end_flush_machinery Ming Lei
2020-05-13 12:00   ` Christoph Hellwig
2020-05-13  3:48 ` [PATCH V11 09/12] blk-mq: add blk_mq_hctx_handle_dead_cpu for handling cpu dead Ming Lei
2020-05-13 12:06   ` Christoph Hellwig
2020-05-13  3:48 ` Ming Lei [this message]
2020-05-13 10:34   ` [PATCH V12 10/12] block: add request allocation flag of BLK_MQ_REQ_FORCE Ming Lei
2020-05-13  3:48 ` [PATCH V11 11/12] blk-mq: re-submit IO in case that hctx is inactive Ming Lei
2020-05-13  9:21   ` John Garry
2020-05-13 12:21   ` Christoph Hellwig
2020-05-13 15:03     ` Bart Van Assche
2020-05-14  0:45       ` Ming Lei
2020-05-14  0:40     ` Ming Lei
2020-05-13  3:48 ` [PATCH V11 12/12] block: deactivate hctx when the hctx is actually inactive Ming Lei
2020-05-13  7:34 ` [PATCH V11 00/12] blk-mq: improvement CPU hotplug John Garry
2020-05-13 10:37   ` Ming Lei
2020-05-13 11:33     ` John Garry

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200513034803.1844579-11-ming.lei@redhat.com \
    --to=ming.lei@redhat.com \
    --cc=axboe@kernel.dk \
    --cc=bvanassche@acm.org \
    --cc=hare@suse.com \
    --cc=hch@lst.de \
    --cc=john.garry@huawei.com \
    --cc=linux-block@vger.kernel.org \
    --cc=tglx@linutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).