aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWarner Losh <imp@FreeBSD.org>2023-09-28 20:46:00 +0000
committerWarner Losh <imp@FreeBSD.org>2023-09-28 22:26:13 +0000
commitb2bcb31fef42448c5cd374b46ce5e40e41339c48 (patch)
tree422f9141de1daf379b371b0212af46924f5fb25d
parent7e715964e109e74f0ea4a8f25861628fe20e60dd (diff)
nvme: Give up when we've failed
Normally, we poll the device every so often to see if commands have timed out. However, we'll go into the recovery state as part of failing the drive. To account for all possibilties, if we're failed when we get into the polling function, just stop polling: Party is over. Sponsored by: Netflix (cherry picked from commit d95431624f934fe4740211738fc787808005b14e) (cherry picked from commit 5e9b7d0e0e0bd4cba29de33569ab0ca86763f635) Approved-by: re (cperciva)
-rw-r--r--sys/dev/nvme/nvme_qpair.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/sys/dev/nvme/nvme_qpair.c b/sys/dev/nvme/nvme_qpair.c
index b256c4713c8d..4e37aa0e1020 100644
--- a/sys/dev/nvme/nvme_qpair.c
+++ b/sys/dev/nvme/nvme_qpair.c
@@ -1011,6 +1011,17 @@ nvme_qpair_timeout(void *arg)
mtx_assert(&qpair->recovery, MA_OWNED);
+ /*
+ * If the controller has failed, give up. We're never going to change
+ * state from a failed controller: no further transactions are possible.
+ * We go ahead and let the timeout expire in many cases for simplicity.
+ */
+ if (qpair->ctrlr->is_failed) {
+ nvme_printf(ctrlr, "Controller failed, giving up\n");
+ qpair->timer_armed = false;
+ return;
+ }
+
switch (qpair->recovery_state) {
case RECOVERY_NONE:
/*
@@ -1094,8 +1105,8 @@ nvme_qpair_timeout(void *arg)
idle = false; /* We want to keep polling */
break;
case RECOVERY_WAITING:
- nvme_printf(ctrlr, "waiting for reset to complete\n");
- idle = false; /* We want to keep polling */
+ nvme_printf(ctrlr, "Waiting for reset to complete\n");
+ idle = false; /* We want to keep polling */
break;
}