From: Chao Leng <lengchao@huawei.com>
To: Keith Busch <kbusch@fb.com>, <linux-nvme@lists.infradead.org>
Cc: <hch@lst.de>, Keith Busch <kbusch@kernel.org>,
Jonathan Derrick <Jonathan.Derrick@solidigm.com>
Subject: Re: [PATCH] nvme: don't flush scan work with non-idle request
Date: Tue, 16 Aug 2022 16:53:34 +0800 [thread overview]
Message-ID: <e034ba1d-b43e-6813-37b8-7b341dbdb573@huawei.com> (raw)
In-Reply-To: <20220812182147.1564958-1-kbusch@fb.com>
Looks good to me.
Reviewed-by: Chao Leng <lengchao@huawei.com>
On 2022/8/13 2:21, Keith Busch wrote:
> From: Keith Busch <kbusch@kernel.org>
>
> If a reset occurs after the scan work attempts to issue a command, the
> reset may quisce the admin queue, which blocks the scan work's command
> from dispatching. The scan work will not be able to complete while the
> queue is quiesced.
>
> Meanwhile, the reset work will cancel all outstanding admin tags and
> wait until all requests have transitioned to idle, which includes the
> passthrough request. But the passthrough request won't be set to idle
> until after the scan_work flushes, so we're deadlocked.
>
> Fix this by moving the flush_work after the request has been freed.
>
> Link: https://bugzilla.kernel.org/show_bug.cgi?id=216354
> Reported-by: Jonathan Derrick <Jonathan.Derrick@solidigm.com>
> Signed-off-by: Keith Busch <kbusch@kernel.org>
> ---
> drivers/nvme/host/core.c | 5 ++---
> drivers/nvme/host/ioctl.c | 12 ++++++++++++
> 2 files changed, 14 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
> index af367b22871b..1143f625e195 100644
> --- a/drivers/nvme/host/core.c
> +++ b/drivers/nvme/host/core.c
> @@ -1121,12 +1121,11 @@ static void nvme_passthru_end(struct nvme_ctrl *ctrl, u32 effects,
> nvme_remove_invalid_namespaces(ctrl, NVME_NSID_ALL);
> mutex_unlock(&ctrl->scan_lock);
> }
> +
> if (effects & NVME_CMD_EFFECTS_CCC)
> nvme_init_ctrl_finish(ctrl);
> - if (effects & (NVME_CMD_EFFECTS_NIC | NVME_CMD_EFFECTS_NCC)) {
> + if (effects & (NVME_CMD_EFFECTS_NIC | NVME_CMD_EFFECTS_NCC))
> nvme_queue_scan(ctrl);
> - flush_work(&ctrl->scan_work);
> - }
>
> switch (cmd->common.opcode) {
> case nvme_admin_set_features:
> diff --git a/drivers/nvme/host/ioctl.c b/drivers/nvme/host/ioctl.c
> index 27614bee7380..97febd5f41a3 100644
> --- a/drivers/nvme/host/ioctl.c
> +++ b/drivers/nvme/host/ioctl.c
> @@ -136,9 +136,11 @@ static int nvme_submit_user_cmd(struct request_queue *q,
> unsigned bufflen, void __user *meta_buffer, unsigned meta_len,
> u32 meta_seed, u64 *result, unsigned timeout, bool vec)
> {
> + struct nvme_ctrl *ctrl;
> struct request *req;
> void *meta = NULL;
> struct bio *bio;
> + u32 effects;
> int ret;
>
> req = nvme_alloc_user_request(q, cmd, ubuffer, bufflen, meta_buffer,
> @@ -147,6 +149,8 @@ static int nvme_submit_user_cmd(struct request_queue *q,
> return PTR_ERR(req);
>
> bio = req->bio;
> + ctrl = nvme_req(req)->ctrl;
> + effects = nvme_command_effects(ctrl, q->queuedata, cmd->common.opcode);
>
> ret = nvme_execute_passthru_rq(req);
>
> @@ -158,6 +162,14 @@ static int nvme_submit_user_cmd(struct request_queue *q,
> if (bio)
> blk_rq_unmap_user(bio);
> blk_mq_free_request(req);
> +
> + /*
> + * Ensure the namespace inventory is up-to-date before returning if
> + * this command can change it.
> + */
> + if (ret >= 0 && effects & (NVME_CMD_EFFECTS_NIC | NVME_CMD_EFFECTS_NCC))
> + flush_work(&ctrl->scan_work);
Maybe it is better to move nvme_queue_scan together here.
> +
> return ret;
> }
>
>
next prev parent reply other threads:[~2022-08-16 8:53 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-12 18:21 [PATCH] nvme: don't flush scan work with non-idle request Keith Busch
2022-08-12 19:12 ` Jonathan Derrick
2022-08-16 8:53 ` Chao Leng [this message]
2022-08-17 10:29 ` Sagi Grimberg
2022-08-17 15:07 ` Keith Busch
2022-08-17 15:39 ` Sagi Grimberg
2022-08-21 14:40 ` Christoph Hellwig
2022-08-22 15:09 ` Keith Busch
2022-08-23 16:14 ` Christoph Hellwig
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=e034ba1d-b43e-6813-37b8-7b341dbdb573@huawei.com \
--to=lengchao@huawei.com \
--cc=Jonathan.Derrick@solidigm.com \
--cc=hch@lst.de \
--cc=kbusch@fb.com \
--cc=kbusch@kernel.org \
--cc=linux-nvme@lists.infradead.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.