Commit 5bc79e9c authored by Isaac Otsiabah's avatar Isaac Otsiabah Committed by Daniel Verkamp
Browse files

bdev/nvme: add option to reset on I/O timeout



Change-Id: I7128a1f2916af8470b0564025f5f30e299ab992b
Signed-off-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
parent 7c60aec0
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -106,6 +106,10 @@
  # The maximum number of NVMe controllers to claim. Do not include this key to
  # claim all of them.
  NumControllers 2
  # Registers the application to receive timeout callback and to reset the controller.
  ResetControllerOnTimeout Yes
  # Timeout value.
  NvmeTimeoutValue 30

# Users may change this section to create a different number or size of
#  malloc LUNs.
+5 −0
Original line number Diff line number Diff line
@@ -64,6 +64,11 @@
  # poll. Units in microseconds.
  AcceptorPollRate 10000

  # Registers the application to receive timeout callback and to reset the controller.
  ResetControllerOnTimeout Yes
  # Timeout value.
  NvmeTimeoutValue 30

# Define an NVMf Subsystem.
# - NQN is required and must be unique.
# - Core may be set or not. If set, the specified subsystem will run on
+32 −0
Original line number Diff line number Diff line
@@ -112,6 +112,8 @@ static int nvme_luns_per_ns = 1;
static int nvme_controller_index = 0;
static int lun_size_in_mb = 0;
static int num_controllers = -1;
static int g_reset_controller_on_timeout = 0;
static int g_timeout = 0;

static TAILQ_HEAD(, nvme_device)	g_nvme_devices = TAILQ_HEAD_INITIALIZER(g_nvme_devices);;

@@ -445,6 +447,20 @@ probe_cb(void *cb_ctx, const struct spdk_nvme_probe_info *probe_info,
	return true;
}

static void
blockdev_nvme_timeout_cb(struct spdk_nvme_ctrlr *ctrlr,
			 struct spdk_nvme_qpair *qpair, void *cb_arg)
{
	int rc;

	SPDK_WARNLOG("Warning: Detected a timeout. ctrlr=%p qpair=%p\n", ctrlr, qpair);

	rc = spdk_nvme_ctrlr_reset(ctrlr);
	if (rc) {
		SPDK_ERRLOG("resetting controller failed\n");
	}
}

static void
attach_cb(void *cb_ctx, const struct spdk_nvme_probe_info *probe_info,
	  struct spdk_nvme_ctrlr *ctrlr, const struct spdk_nvme_ctrlr_opts *opts)
@@ -470,6 +486,11 @@ attach_cb(void *cb_ctx, const struct spdk_nvme_probe_info *probe_info,
	if (ctx->controllers_remaining > 0) {
		ctx->controllers_remaining--;
	}

	if (g_reset_controller_on_timeout) {
		spdk_nvme_ctrlr_register_timeout_callback(ctrlr, g_timeout,
				blockdev_nvme_timeout_cb, NULL);
	}
}

static bool
@@ -579,6 +600,17 @@ nvme_library_init(void)

	probe_ctx.controllers_remaining = num_controllers;

	val = spdk_conf_section_get_val(sp, "ResetControllerOnTimeout");
	if (val != NULL) {
		if (!strcmp(val, "Yes")) {
			g_reset_controller_on_timeout = 1;
		}
	}

	if ((g_timeout = spdk_conf_section_get_intval(sp, "NvmeTimeoutValue")) < 0) {
		g_timeout = 0;
	}

	return spdk_bdev_nvme_create(&probe_ctx);
}