lib/nvme: change timeout in wait_for_completions to usec

This allows for much more granular control over the timeout.

Signed-off-by: Seth Howell <seth.howell@intel.com>
Change-Id: Ib23de21e60eec4207c55320579699edf284f4e16
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/3794
Community-CI: Mellanox Build Bot
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@mellanox.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
Seth Howell 2020-08-14 13:55:32 -07:00 committed by Tomasz Zawadzki
parent 85ff3fcea6
commit b3bb3a1bbf
6 changed files with 22 additions and 21 deletions

View File

@ -164,7 +164,7 @@ nvme_wait_for_completion(struct spdk_nvme_qpair *qpair,
* \param qpair queue to poll
* \param status completion status. The user must fill this structure with zeroes before calling
* this function
* \param timeout_in_secs optional timeout
* \param timeout_in_usecs optional timeout
*
* \return 0 if command completed without error,
* -EIO if command completed with error,
@ -176,13 +176,13 @@ nvme_wait_for_completion(struct spdk_nvme_qpair *qpair,
int
nvme_wait_for_completion_timeout(struct spdk_nvme_qpair *qpair,
struct nvme_completion_poll_status *status,
uint64_t timeout_in_secs)
uint64_t timeout_in_usecs)
{
uint64_t timeout_tsc = 0;
int rc = 0;
if (timeout_in_secs) {
timeout_tsc = spdk_get_ticks() + timeout_in_secs * spdk_get_ticks_hz();
if (timeout_in_usecs) {
timeout_tsc = spdk_get_ticks() + timeout_in_usecs * spdk_get_ticks_hz() / SPDK_SEC_TO_USEC;
}
while (status->done == false) {

View File

@ -653,7 +653,7 @@ static int nvme_ctrlr_set_intel_support_log_pages(struct spdk_nvme_ctrlr *ctrlr)
}
if (nvme_wait_for_completion_timeout(ctrlr->adminq, status,
ctrlr->opts.admin_timeout_ms / 1000)) {
ctrlr->opts.admin_timeout_ms * 1000)) {
spdk_free(log_page_directory);
SPDK_WARNLOG("Intel log pages not supported on Intel drive!\n");
if (!status->timed_out) {
@ -738,7 +738,7 @@ nvme_ctrlr_set_arbitration_feature(struct spdk_nvme_ctrlr *ctrlr)
}
if (nvme_wait_for_completion_timeout(ctrlr->adminq, status,
ctrlr->opts.admin_timeout_ms / 1000)) {
ctrlr->opts.admin_timeout_ms * 1000)) {
SPDK_ERRLOG("Timeout to set arbitration feature\n");
}

View File

@ -43,7 +43,8 @@
#ifdef DEBUG
#define NVME_FABRIC_CONNECT_COMMAND_TIMEOUT 0
#else
#define NVME_FABRIC_CONNECT_COMMAND_TIMEOUT 1
/* 500 millisecond timeout. */
#define NVME_FABRIC_CONNECT_COMMAND_TIMEOUT 500000
#endif
static int

View File

@ -896,7 +896,7 @@ int nvme_wait_for_completion_robust_lock(struct spdk_nvme_qpair *qpair,
pthread_mutex_t *robust_mutex);
int nvme_wait_for_completion_timeout(struct spdk_nvme_qpair *qpair,
struct nvme_completion_poll_status *status,
uint64_t timeout_in_secs);
uint64_t timeout_in_usecs);
struct spdk_nvme_ctrlr_process *nvme_ctrlr_get_process(struct spdk_nvme_ctrlr *ctrlr,
pid_t pid);

View File

@ -1233,15 +1233,15 @@ test_nvme_request_check_timeout(void)
}
struct nvme_completion_poll_status g_status;
uint64_t completion_delay, timeout_in_secs;
uint64_t completion_delay_us, timeout_in_usecs;
int g_process_comp_result;
int
spdk_nvme_qpair_process_completions(struct spdk_nvme_qpair *qpair, uint32_t max_completions)
{
spdk_delay_us(completion_delay * spdk_get_ticks_hz());
spdk_delay_us(completion_delay_us);
g_status.done = completion_delay < timeout_in_secs && g_process_comp_result == 0 ? true : false;
g_status.done = completion_delay_us < timeout_in_usecs && g_process_comp_result == 0 ? true : false;
return g_process_comp_result;
}
@ -1256,9 +1256,9 @@ test_nvme_wait_for_completion(void)
/* completion timeout */
memset(&g_status, 0, sizeof(g_status));
completion_delay = 2;
timeout_in_secs = 1;
rc = nvme_wait_for_completion_timeout(&qpair, &g_status, timeout_in_secs);
completion_delay_us = 2000000;
timeout_in_usecs = 1000000;
rc = nvme_wait_for_completion_timeout(&qpair, &g_status, timeout_in_usecs);
CU_ASSERT(g_status.timed_out == true);
CU_ASSERT(g_status.done == false);
CU_ASSERT(rc == -ECANCELED);
@ -1266,9 +1266,9 @@ test_nvme_wait_for_completion(void)
/* spdk_nvme_qpair_process_completions returns error */
memset(&g_status, 0, sizeof(g_status));
g_process_comp_result = -1;
completion_delay = 1;
timeout_in_secs = 2;
rc = nvme_wait_for_completion_timeout(&qpair, &g_status, timeout_in_secs);
completion_delay_us = 1000000;
timeout_in_usecs = 2000000;
rc = nvme_wait_for_completion_timeout(&qpair, &g_status, timeout_in_usecs);
CU_ASSERT(rc == -ECANCELED);
CU_ASSERT(g_status.timed_out == true);
CU_ASSERT(g_status.done == false);
@ -1279,9 +1279,9 @@ test_nvme_wait_for_completion(void)
/* complete in time */
memset(&g_status, 0, sizeof(g_status));
completion_delay = 1;
timeout_in_secs = 2;
rc = nvme_wait_for_completion_timeout(&qpair, &g_status, timeout_in_secs);
completion_delay_us = 1000000;
timeout_in_usecs = 2000000;
rc = nvme_wait_for_completion_timeout(&qpair, &g_status, timeout_in_usecs);
CU_ASSERT(g_status.timed_out == false);
CU_ASSERT(g_status.done == true);
CU_ASSERT(rc == 0);

View File

@ -318,7 +318,7 @@ nvme_wait_for_completion(struct spdk_nvme_qpair *qpair,
int
nvme_wait_for_completion_timeout(struct spdk_nvme_qpair *qpair,
struct nvme_completion_poll_status *status,
uint64_t timeout_in_secs)
uint64_t timeout_in_usecs)
{
return nvme_wait_for_completion_robust_lock(qpair, status, NULL);
}