From: Jens Axboe <axboe@kernel.dk>
To: Hannes Reinecke <hare@suse.de>, Christoph Hellwig <hch@lst.de>
Cc: Sagi Grimberg <sagi@grimberg.me>, Keith Busch <kbusch@kernel.org>,
linux-nvme@lists.infradead.org
Subject: Re: [PATCH 1/2] nvmet-rdma: avoid circular locking dependency on install_queue()
Date: Wed, 1 Nov 2023 10:21:34 -0600 [thread overview]
Message-ID: <29253636-b9da-40b0-a217-013800ffc18c@kernel.dk> (raw)
In-Reply-To: <20231101103228.136570-2-hare@suse.de>
On 11/1/23 4:32 AM, Hannes Reinecke wrote:
> nvmet_rdma_install_queue() is driven from the ->io_work workqueue
> function, but will call flush_workqueue() which might trigger
> ->release_work() which in itself calls flush_work on ->io_work.
>
> To avoid that check for pending queue in disconnecting status,
> and return 'controller busy' until all disconnects are completed.
>
> Signed-off-by: Hannes Reinecke <hare@suse.de>
> ---
> drivers/nvme/target/rdma.c | 14 ++++++++++++--
> 1 file changed, 12 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/nvme/target/rdma.c b/drivers/nvme/target/rdma.c
> index 4597bca43a6d..eaeb94a9e863 100644
> --- a/drivers/nvme/target/rdma.c
> +++ b/drivers/nvme/target/rdma.c
> @@ -1583,8 +1583,18 @@ static int nvmet_rdma_queue_connect(struct rdma_cm_id *cm_id,
> }
>
> if (queue->host_qid == 0) {
> - /* Let inflight controller teardown complete */
> - flush_workqueue(nvmet_wq);
> + struct nvmet_rdma_queue *q;
> + int pending = 0;
> +
> + mutex_lock(&nvmet_rdma_queue_mutex);
> + list_for_each_entry(q, &nvmet_rdma_queue_list, queue_list) {
> + if (q->state == NVMET_RDMA_Q_DISCONNECTING)
> + pending++;
> + }
> + mutex_unlock(&nvmet_rdma_queue_mutex);
> + /* Retry for pending controller teardown */
> + if (pending)
> + return NVME_SC_CONNECT_CTRL_BUSY;
Not sure if it's worth turning this into a helper since both patches do
the same thing. Probably not, since you'd need to pass in the mutex and
state too. In any case, why not just break if you hit
NVMET_RDMA_Q_DISCONNECTING rather than keep looping? You don't care
about the exact count, jsut whether it's non-zero or not.
--
Jens Axboe
next prev parent reply other threads:[~2023-11-01 16:21 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-11-01 10:32 [PATCH 0/2] nvmet: avoid circular locking warning Hannes Reinecke
2023-11-01 10:32 ` [PATCH 1/2] nvmet-rdma: avoid circular locking dependency on install_queue() Hannes Reinecke
2023-11-01 16:21 ` Jens Axboe [this message]
2023-11-01 17:28 ` Hannes Reinecke
2023-11-01 10:32 ` [PATCH 2/2] nvmet-tcp: " Hannes Reinecke
2023-11-01 12:40 ` [PATCH 0/2] nvmet: avoid circular locking warning Shinichiro Kawasaki
-- strict thread matches above, loose matches on Subject: below --
2023-11-02 14:19 [PATCHv2 " Hannes Reinecke
2023-11-02 14:19 ` [PATCH 1/2] nvmet-rdma: avoid circular locking dependency on install_queue() Hannes Reinecke
2023-11-03 8:23 ` Christoph Hellwig
2023-11-03 8:53 ` Hannes Reinecke
2023-11-03 9:19 ` Christoph Hellwig
2023-11-03 11:58 ` Hannes Reinecke
2023-11-03 14:05 ` Christoph Hellwig
2023-11-20 13:48 ` Sagi Grimberg
2023-12-04 10:19 ` Sagi Grimberg
2023-12-04 11:49 ` Hannes Reinecke
2023-12-04 11:57 ` Sagi Grimberg
2023-12-04 12:31 ` Hannes Reinecke
2023-12-04 12:46 ` Sagi Grimberg
2023-12-07 5:54 ` Shinichiro Kawasaki
2023-12-07 12:17 ` Sagi Grimberg
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=29253636-b9da-40b0-a217-013800ffc18c@kernel.dk \
--to=axboe@kernel.dk \
--cc=hare@suse.de \
--cc=hch@lst.de \
--cc=kbusch@kernel.org \
--cc=linux-nvme@lists.infradead.org \
--cc=sagi@grimberg.me \
/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