Commit ef9c8b64 authored by Konrad Sztyber's avatar Konrad Sztyber Committed by Tomasz Zawadzki
Browse files

test/nvme_dp: add option to specify ctrlr's trid



Beside allowing users to specify a single device on which the test
should be performed, it'll make it possible to catch issues with
initialization of that controller (as spdk_nvme_probe() doesn't report
errors when one of the controllers fails to initialize).

Fixes #3081.

Signed-off-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Change-Id: I7b9005001c2d8727238494d2a0c3f177f7947026
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/19164


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
parent c17d6515
Loading
Loading
Loading
Loading
+49 −4
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ struct dev {

static struct dev devs[MAX_DEVS];
static int num_devs = 0;
static struct spdk_nvme_transport_id g_trid = {};

#define foreach_dev(iter) \
	for (iter = devs; iter - devs < num_devs; iter++)
@@ -569,8 +570,7 @@ probe_cb(void *cb_ctx, const struct spdk_nvme_transport_id *trid,
}

static void
attach_cb(void *cb_ctx, const struct spdk_nvme_transport_id *trid,
	  struct spdk_nvme_ctrlr *ctrlr, const struct spdk_nvme_ctrlr_opts *opts)
add_ctrlr(struct spdk_nvme_ctrlr *ctrlr)
{
	struct dev *dev;

@@ -580,11 +580,43 @@ attach_cb(void *cb_ctx, const struct spdk_nvme_transport_id *trid,
	dev->ctrlr = ctrlr;

	snprintf(dev->name, sizeof(dev->name), "%s",
		 trid->traddr);
		 spdk_nvme_ctrlr_get_transport_id(ctrlr)->traddr);

	printf("Attached to %s\n", dev->name);
}

static void
attach_cb(void *cb_ctx, const struct spdk_nvme_transport_id *trid,
	  struct spdk_nvme_ctrlr *ctrlr, const struct spdk_nvme_ctrlr_opts *opts)
{
	add_ctrlr(ctrlr);
}

static int
parse_args(int argc, char **argv)
{
	int op;

	spdk_nvme_trid_populate_transport(&g_trid, SPDK_NVME_TRANSPORT_PCIE);
	snprintf(g_trid.subnqn, sizeof(g_trid.subnqn), "%s", SPDK_NVMF_DISCOVERY_NQN);

	while ((op = getopt(argc, argv, "r:")) != -1) {
		switch (op) {
		case 'r':
			if (spdk_nvme_transport_id_parse(&g_trid, optarg) != 0) {
				fprintf(stderr, "Error parsing transport address\n");
				return -EINVAL;
			}
			break;
		default:
			fprintf(stderr, "Usage: %s [-r trid]\n", argv[0]);
			return -EINVAL;
		}
	}

	return 0;
}

int
main(int argc, char **argv)
{
@@ -592,6 +624,7 @@ main(int argc, char **argv)
	int			rc;
	struct spdk_env_opts	opts;
	struct spdk_nvme_detach_ctx *detach_ctx = NULL;
	struct spdk_nvme_ctrlr	*ctrlr;

	spdk_env_opts_init(&opts);
	opts.name = "nvme_dp";
@@ -602,9 +635,21 @@ main(int argc, char **argv)
		return 1;
	}

	if (parse_args(argc, argv) != 0) {
		return 1;
	}

	printf("NVMe Write/Read with End-to-End data protection test\n");

	if (spdk_nvme_probe(NULL, NULL, probe_cb, attach_cb, NULL) != 0) {
	if (g_trid.traddr[0] != '\0') {
		ctrlr = spdk_nvme_connect(&g_trid, NULL, 0);
		if (ctrlr == NULL) {
			fprintf(stderr, "nvme_connect() failed\n");
			return 1;
		}

		add_ctrlr(ctrlr);
	} else if (spdk_nvme_probe(&g_trid, NULL, probe_cb, attach_cb, NULL) != 0) {
		fprintf(stderr, "nvme_probe() failed\n");
		exit(1);
	}