From ba773a54c769b2a4bee0ef08895659cb4fc9388e Mon Sep 17 00:00:00 2001 From: Jin Yu Date: Mon, 7 Sep 2020 17:52:38 +0800 Subject: [PATCH] nvme: fix keep alive issues in host side There are two bugs: 1, When the target response 0, it means target does't support keep alive. 2, Change the interval time to us so when the keep alive timeout is 1ms then the interval is 500us. Fix github issue: #1565 Change-Id: I75707ab0e4e639209a9c50ef326492fae213044d Signed-off-by: Jin Yu Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/4077 Reviewed-by: Changpeng Liu Reviewed-by: Aleksey Marchuk Tested-by: SPDK CI Jenkins --- lib/nvme/nvme_ctrlr.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/lib/nvme/nvme_ctrlr.c b/lib/nvme/nvme_ctrlr.c index 6e6c7913e..25b220e43 100644 --- a/lib/nvme/nvme_ctrlr.c +++ b/lib/nvme/nvme_ctrlr.c @@ -1846,7 +1846,7 @@ nvme_ctrlr_set_num_queues(struct spdk_nvme_ctrlr *ctrlr) static void nvme_ctrlr_set_keep_alive_timeout_done(void *arg, const struct spdk_nvme_cpl *cpl) { - uint32_t keep_alive_interval_ms; + uint32_t keep_alive_interval_us; struct spdk_nvme_ctrlr *ctrlr = (struct spdk_nvme_ctrlr *)arg; if (spdk_nvme_cpl_is_error(cpl)) { @@ -1869,16 +1869,20 @@ nvme_ctrlr_set_keep_alive_timeout_done(void *arg, const struct spdk_nvme_cpl *cp ctrlr->opts.keep_alive_timeout_ms = cpl->cdw0; } - keep_alive_interval_ms = ctrlr->opts.keep_alive_timeout_ms / 2; - if (keep_alive_interval_ms == 0) { - keep_alive_interval_ms = 1; + if (ctrlr->opts.keep_alive_timeout_ms == 0) { + ctrlr->keep_alive_interval_ticks = 0; + } else { + keep_alive_interval_us = ctrlr->opts.keep_alive_timeout_ms * 1000 / 2; + + SPDK_DEBUGLOG(SPDK_LOG_NVME, "Sending keep alive every %u us\n", keep_alive_interval_us); + + ctrlr->keep_alive_interval_ticks = (keep_alive_interval_us * spdk_get_ticks_hz()) / + UINT64_C(1000000); + + /* Schedule the first Keep Alive to be sent as soon as possible. */ + ctrlr->next_keep_alive_tick = spdk_get_ticks(); } - SPDK_DEBUGLOG(SPDK_LOG_NVME, "Sending keep alive every %u ms\n", keep_alive_interval_ms); - ctrlr->keep_alive_interval_ticks = (keep_alive_interval_ms * spdk_get_ticks_hz()) / UINT64_C(1000); - - /* Schedule the first Keep Alive to be sent as soon as possible. */ - ctrlr->next_keep_alive_tick = spdk_get_ticks(); nvme_ctrlr_set_state(ctrlr, NVME_CTRLR_STATE_SET_HOST_ID, ctrlr->opts.admin_timeout_ms); }