Commit b3bb3a1b authored by Seth Howell's avatar Seth Howell Committed by Tomasz Zawadzki
Browse files

lib/nvme: change timeout in wait_for_completions to usec



This allows for much more granular control over the timeout.

Signed-off-by: default avatarSeth 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: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@mellanox.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent 85ff3fce
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -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) {
+2 −2
Original line number Diff line number Diff line
@@ -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");
	}

+2 −1
Original line number Diff line number Diff line
@@ -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
+1 −1
Original line number Diff line number Diff line
@@ -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);
+12 −12
Original line number Diff line number Diff line
@@ -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);
Loading