All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] nvme-mpath: fix I/O failure with EAGAIN when failing over I/O
@ 2023-06-20 13:07 Sagi Grimberg
  2023-06-20 13:21 ` Christoph Hellwig
  2023-06-27 15:19 ` Keith Busch
  0 siblings, 2 replies; 3+ messages in thread
From: Sagi Grimberg @ 2023-06-20 13:07 UTC (permalink / raw)
  To: linux-nvme; +Cc: Christoph Hellwig, Keith Busch

It is possible that the next available path we failover to, happens to
be frozen (for example if it is during connection establishment). If
the original I/O was set with NOWAIT, this cause the I/O to unnecessarily
fail because the request queue cannot be entered, hence the I/O fails with
EAGAIN.

The NOWAIT restriction that was originally set for the I/O is no longer
relevant or needed because this is the nvme requeue context. Hence we
clear the REQ_NOWAIT flag when failing over I/O.

This fix a simple test case of nvme controller reset during I/O when the
multipath device that has only a single path and I/O fails with "Resource
temporarily unavailable" errno. Note that this reproduces with io_uring
which by default sets IOCB_NOWAIT by default.

Signed-off-by: Sagi Grimberg <sagi@grimberg.me>
---
Changes from v1:
- Add a code comment to explain why we clear REQ_NOWAIT in failover

 drivers/nvme/host/multipath.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c
index 2bc159a318ff..7d93bbbc01ac 100644
--- a/drivers/nvme/host/multipath.c
+++ b/drivers/nvme/host/multipath.c
@@ -106,6 +106,14 @@ void nvme_failover_req(struct request *req)
 			bio->bi_opf &= ~REQ_POLLED;
 			bio->bi_cookie = BLK_QC_T_NONE;
 		}
+		/*
+		 * The alternate request queue that we may end up submitting
+		 * the bio to may be frozen temporarily, in this case REQ_NOWAIT
+		 * will fail the I/O immediately with EAGAIN to the issuer.
+		 * We are not in the issuer context which cannot block. Clear
+		 * the flag to avoid spurious EAGAIN I/O failures.
+		 */
+		bio->bi_opf &= ~REQ_NOWAIT;
 	}
 	blk_steal_bios(&ns->head->requeue_list, req);
 	spin_unlock_irqrestore(&ns->head->requeue_lock, flags);
-- 
2.40.1



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

* Re: [PATCH v2] nvme-mpath: fix I/O failure with EAGAIN when failing over I/O
  2023-06-20 13:07 [PATCH v2] nvme-mpath: fix I/O failure with EAGAIN when failing over I/O Sagi Grimberg
@ 2023-06-20 13:21 ` Christoph Hellwig
  2023-06-27 15:19 ` Keith Busch
  1 sibling, 0 replies; 3+ messages in thread
From: Christoph Hellwig @ 2023-06-20 13:21 UTC (permalink / raw)
  To: Sagi Grimberg; +Cc: linux-nvme, Christoph Hellwig, Keith Busch

Looks good:

Reviewed-by: Christoph Hellwig <hch@lst.de>



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

* Re: [PATCH v2] nvme-mpath: fix I/O failure with EAGAIN when failing over I/O
  2023-06-20 13:07 [PATCH v2] nvme-mpath: fix I/O failure with EAGAIN when failing over I/O Sagi Grimberg
  2023-06-20 13:21 ` Christoph Hellwig
@ 2023-06-27 15:19 ` Keith Busch
  1 sibling, 0 replies; 3+ messages in thread
From: Keith Busch @ 2023-06-27 15:19 UTC (permalink / raw)
  To: Sagi Grimberg; +Cc: linux-nvme, Christoph Hellwig

Applied, thanks!


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

end of thread, other threads:[~2023-06-27 15:19 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-06-20 13:07 [PATCH v2] nvme-mpath: fix I/O failure with EAGAIN when failing over I/O Sagi Grimberg
2023-06-20 13:21 ` Christoph Hellwig
2023-06-27 15:19 ` Keith Busch

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.