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:
Shuhei Matsumoto 2022-05-11 14:24:28 +09:00 committed by Tomasz Zawadzki
parent fcf52fbff5
commit e4584d937e
2 changed files with 22 additions and 43 deletions

View File

@ -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 {

View File

@ -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();