bdev/nvme: Poll adminq more often during ctrlr disconnection
During ctrlr reconnection, spdk_nvme_ctrlr_reconnect_poll_async() is executed by a non-timed poller. We should poll adminq more often during ctrlr disconnection too. Signed-off-by: Shuhei Matsumoto <smatsumoto@nvidia.com> Change-Id: Ib1f5b41015aed20deda8df6f2c837981ac233c04 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/12615 Reviewed-by: Dong Yi <dongx.yi@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Aleksey Marchuk <alexeymar@nvidia.com> Reviewed-by: Michael Haeuptle <michaelhaeuptle@gmail.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com> Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com> Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
parent
fcf52fbff5
commit
e4584d937e
@ -1297,6 +1297,17 @@ bdev_nvme_poll(void *arg)
|
||||
return num_completions > 0 ? SPDK_POLLER_BUSY : SPDK_POLLER_IDLE;
|
||||
}
|
||||
|
||||
static int bdev_nvme_poll_adminq(void *arg);
|
||||
|
||||
static void
|
||||
bdev_nvme_change_adminq_poll_period(struct nvme_ctrlr *nvme_ctrlr, uint64_t new_period_us)
|
||||
{
|
||||
spdk_poller_unregister(&nvme_ctrlr->adminq_timer_poller);
|
||||
|
||||
nvme_ctrlr->adminq_timer_poller = SPDK_POLLER_REGISTER(bdev_nvme_poll_adminq,
|
||||
nvme_ctrlr, new_period_us);
|
||||
}
|
||||
|
||||
static int
|
||||
bdev_nvme_poll_adminq(void *arg)
|
||||
{
|
||||
@ -1312,6 +1323,8 @@ bdev_nvme_poll_adminq(void *arg)
|
||||
nvme_ctrlr->disconnected_cb = NULL;
|
||||
|
||||
if (rc == -ENXIO && disconnected_cb != NULL) {
|
||||
bdev_nvme_change_adminq_poll_period(nvme_ctrlr,
|
||||
g_opts.nvme_adminq_poll_period_us);
|
||||
disconnected_cb(nvme_ctrlr);
|
||||
} else {
|
||||
bdev_nvme_failover(nvme_ctrlr, false);
|
||||
@ -1536,6 +1549,9 @@ nvme_ctrlr_disconnect(struct nvme_ctrlr *nvme_ctrlr, nvme_ctrlr_disconnected_cb
|
||||
*/
|
||||
rc = spdk_nvme_ctrlr_disconnect(nvme_ctrlr->ctrlr);
|
||||
assert(rc == 0);
|
||||
|
||||
/* During disconnection, reduce the period to poll adminq more often. */
|
||||
bdev_nvme_change_adminq_poll_period(nvme_ctrlr, 0);
|
||||
}
|
||||
|
||||
enum bdev_nvme_op_after_reset {
|
||||
|
@ -1721,8 +1721,6 @@ test_race_between_failover_and_add_secondary_trid(void)
|
||||
rc = bdev_nvme_reset(nvme_ctrlr);
|
||||
CU_ASSERT(rc == 0);
|
||||
|
||||
poll_threads();
|
||||
spdk_delay_us(g_opts.nvme_adminq_poll_period_us);
|
||||
poll_threads();
|
||||
|
||||
CU_ASSERT(path_id1->is_failed == true);
|
||||
@ -3970,7 +3968,7 @@ test_reset_bdev_ctrlr(void)
|
||||
CU_ASSERT(io_path22->qpair->qpair == NULL);
|
||||
CU_ASSERT(ctrlr2->is_failed == true);
|
||||
|
||||
poll_thread_times(0, 2);
|
||||
poll_thread_times(0, 1);
|
||||
CU_ASSERT(nvme_ctrlr2->resetting == true);
|
||||
CU_ASSERT(ctrlr2->is_failed == false);
|
||||
CU_ASSERT(ctrlr2->adminq.is_connected == false);
|
||||
@ -5559,20 +5557,12 @@ test_reconnect_ctrlr(void)
|
||||
CU_ASSERT(nvme_ctrlr->resetting == true);
|
||||
CU_ASSERT(ctrlr.is_failed == true);
|
||||
|
||||
poll_threads();
|
||||
spdk_delay_us(g_opts.nvme_adminq_poll_period_us);
|
||||
poll_threads();
|
||||
|
||||
CU_ASSERT(nvme_ctrlr->resetting == false);
|
||||
CU_ASSERT(ctrlr.is_failed == false);
|
||||
CU_ASSERT(ctrlr_ch1->qpair->qpair == NULL);
|
||||
CU_ASSERT(ctrlr_ch2->qpair->qpair == NULL);
|
||||
CU_ASSERT(nvme_ctrlr->reconnect_delay_timer == NULL);
|
||||
CU_ASSERT(nvme_ctrlr->reconnect_is_delayed == false);
|
||||
|
||||
spdk_delay_us(g_opts.nvme_adminq_poll_period_us);
|
||||
poll_threads();
|
||||
|
||||
CU_ASSERT(nvme_ctrlr->reconnect_delay_timer != NULL);
|
||||
CU_ASSERT(nvme_ctrlr->reconnect_is_delayed == true);
|
||||
|
||||
@ -5601,20 +5591,12 @@ test_reconnect_ctrlr(void)
|
||||
CU_ASSERT(nvme_ctrlr->resetting == true);
|
||||
CU_ASSERT(ctrlr.is_failed == true);
|
||||
|
||||
poll_threads();
|
||||
spdk_delay_us(g_opts.nvme_adminq_poll_period_us);
|
||||
poll_threads();
|
||||
|
||||
CU_ASSERT(nvme_ctrlr->resetting == false);
|
||||
CU_ASSERT(ctrlr.is_failed == false);
|
||||
CU_ASSERT(ctrlr_ch1->qpair->qpair == NULL);
|
||||
CU_ASSERT(ctrlr_ch2->qpair->qpair == NULL);
|
||||
CU_ASSERT(nvme_ctrlr->reconnect_delay_timer == NULL);
|
||||
CU_ASSERT(nvme_ctrlr->reconnect_is_delayed == false);
|
||||
|
||||
spdk_delay_us(g_opts.nvme_adminq_poll_period_us);
|
||||
poll_threads();
|
||||
|
||||
CU_ASSERT(nvme_ctrlr->reconnect_delay_timer != NULL);
|
||||
CU_ASSERT(nvme_ctrlr->reconnect_is_delayed == true);
|
||||
|
||||
@ -5728,14 +5710,10 @@ test_retry_failover_ctrlr(void)
|
||||
CU_ASSERT(nvme_ctrlr->resetting == false);
|
||||
CU_ASSERT(ctrlr.is_failed == false);
|
||||
CU_ASSERT(ctrlr_ch->qpair->qpair == NULL);
|
||||
CU_ASSERT(nvme_ctrlr->reconnect_delay_timer == NULL);
|
||||
CU_ASSERT(nvme_ctrlr->reconnect_is_delayed == false);
|
||||
|
||||
CU_ASSERT(nvme_ctrlr->reconnect_delay_timer != NULL);
|
||||
CU_ASSERT(nvme_ctrlr->reconnect_is_delayed == true);
|
||||
CU_ASSERT(path_id1->is_failed == true);
|
||||
|
||||
spdk_delay_us(g_opts.nvme_adminq_poll_period_us);
|
||||
poll_threads();
|
||||
|
||||
CU_ASSERT(nvme_ctrlr->reconnect_delay_timer != NULL);
|
||||
CU_ASSERT(nvme_ctrlr->reconnect_is_delayed == true);
|
||||
|
||||
@ -5880,22 +5858,15 @@ test_fail_path(void)
|
||||
CU_ASSERT(nvme_ctrlr->resetting == true);
|
||||
CU_ASSERT(ctrlr->is_failed == true);
|
||||
|
||||
poll_threads();
|
||||
spdk_delay_us(g_opts.nvme_adminq_poll_period_us);
|
||||
poll_threads();
|
||||
|
||||
CU_ASSERT(nvme_ctrlr->resetting == false);
|
||||
CU_ASSERT(ctrlr->is_failed == false);
|
||||
CU_ASSERT(ctrlr_ch->qpair->qpair == NULL);
|
||||
CU_ASSERT(nvme_ctrlr->reconnect_delay_timer == NULL);
|
||||
CU_ASSERT(nvme_ctrlr->reconnect_delay_timer != NULL);
|
||||
CU_ASSERT(nvme_ctrlr->reset_start_tsc != 0);
|
||||
CU_ASSERT(nvme_ctrlr->fast_io_fail_timedout == false);
|
||||
|
||||
spdk_delay_us(g_opts.nvme_adminq_poll_period_us);
|
||||
poll_threads();
|
||||
|
||||
CU_ASSERT(nvme_ctrlr->reconnect_delay_timer != NULL);
|
||||
|
||||
/* I/O should be queued. */
|
||||
bdev_io->internal.in_submit_request = true;
|
||||
|
||||
@ -5916,13 +5887,10 @@ test_fail_path(void)
|
||||
CU_ASSERT(nvme_ctrlr->resetting == false);
|
||||
CU_ASSERT(ctrlr->is_failed == false);
|
||||
CU_ASSERT(ctrlr_ch->qpair->qpair == NULL);
|
||||
CU_ASSERT(nvme_ctrlr->reconnect_delay_timer == NULL);
|
||||
CU_ASSERT(nvme_ctrlr->reconnect_delay_timer != NULL);
|
||||
CU_ASSERT(bdev_nvme_check_ctrlr_loss_timeout(nvme_ctrlr) == false);
|
||||
CU_ASSERT(nvme_ctrlr->fast_io_fail_timedout == false);
|
||||
|
||||
spdk_delay_us(g_opts.nvme_adminq_poll_period_us);
|
||||
poll_threads();
|
||||
|
||||
CU_ASSERT(nvme_ctrlr->reconnect_delay_timer != NULL);
|
||||
|
||||
/* After two seconds, ctrlr_fail_timeout_sec should expire. */
|
||||
@ -5932,15 +5900,10 @@ test_fail_path(void)
|
||||
CU_ASSERT(nvme_ctrlr->resetting == false);
|
||||
CU_ASSERT(ctrlr->is_failed == false);
|
||||
CU_ASSERT(ctrlr_ch->qpair->qpair == NULL);
|
||||
CU_ASSERT(nvme_ctrlr->reconnect_delay_timer == NULL);
|
||||
CU_ASSERT(nvme_ctrlr->reconnect_delay_timer != NULL);
|
||||
CU_ASSERT(bdev_nvme_check_ctrlr_loss_timeout(nvme_ctrlr) == false);
|
||||
CU_ASSERT(nvme_ctrlr->fast_io_fail_timedout == true);
|
||||
|
||||
spdk_delay_us(g_opts.nvme_adminq_poll_period_us);
|
||||
poll_threads();
|
||||
|
||||
CU_ASSERT(nvme_ctrlr->reconnect_delay_timer != NULL);
|
||||
|
||||
/* Then within a second, pending I/O should be failed. */
|
||||
spdk_delay_us(SPDK_SEC_TO_USEC);
|
||||
poll_threads();
|
||||
|
Loading…
Reference in New Issue
Block a user