Index: sys/dev/nvme/nvme_ctrlr.c =================================================================== --- sys/dev/nvme/nvme_ctrlr.c +++ sys/dev/nvme/nvme_ctrlr.c @@ -263,6 +263,7 @@ static int nvme_ctrlr_wait_for_ready(struct nvme_controller *ctrlr, int desired_val) { + int sanity2 = 1000 * max(1, (1000 / hz)); /* Spin for 1 tick */ int timeout = ticks + MSEC_2_TICKS(ctrlr->ready_timeout_in_ms); uint32_t csts; @@ -278,7 +279,12 @@ "within %d ms\n", desired_val, ctrlr->ready_timeout_in_ms); return (ENXIO); } - pause("nvmerdy", 1); + if (sanity2 == 0) { + pause("nvmerdy", 1); + } else { + sanity2--; + DELAY(1); + } } return (0); Index: sys/dev/nvme/nvme_private.h =================================================================== --- sys/dev/nvme/nvme_private.h +++ sys/dev/nvme/nvme_private.h @@ -469,7 +469,13 @@ nvme_completion_poll(struct nvme_completion_poll_status *status) { int sanity = hz * 10; + int sanity2 = 1000 * max(1, (1000 / hz)); + /* + * Adaptively spin for the first ~ms + */ + while (!atomic_load_acq_int(&status->done) && --sanity2 > 0) + DELAY(1); while (!atomic_load_acq_int(&status->done) && --sanity > 0) pause("nvme", 1); if (sanity <= 0)