Commit 6b4da264 authored by Daniel Verkamp's avatar Daniel Verkamp Committed by Jim Harris
Browse files

bdev/nvme: dynamically allocate probe_ctx



Avoid allocating a large amount of stack space when increasing
NVME_MAX_CONTROLLERS.

Change-Id: I7017e5ed9f4d4f5c860dac608c3e5ae3c35864e7
Signed-off-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
parent d0290b65
Loading
Loading
Loading
Loading
+30 −10
Original line number Diff line number Diff line
@@ -715,7 +715,7 @@ spdk_bdev_nvme_create(struct spdk_nvme_transport_id *trid,
		      const char *base_name,
		      const char **names, size_t *count)
{
	struct nvme_probe_ctx	probe_ctx;
	struct nvme_probe_ctx	*probe_ctx;
	struct nvme_ctrlr	*nvme_ctrlr;
	struct nvme_bdev	*nvme_bdev;
	size_t			j;
@@ -725,17 +725,25 @@ spdk_bdev_nvme_create(struct spdk_nvme_transport_id *trid,
		return -1;
	}

	probe_ctx.count = 1;
	probe_ctx.trids[0] = *trid;
	probe_ctx.names[0] = base_name;
	if (spdk_nvme_probe(trid, &probe_ctx, probe_cb, attach_cb, NULL)) {
	probe_ctx = calloc(1, sizeof(*probe_ctx));
	if (probe_ctx == NULL) {
		SPDK_ERRLOG("Failed to allocate probe_ctx\n");
		return -1;
	}

	probe_ctx->count = 1;
	probe_ctx->trids[0] = *trid;
	probe_ctx->names[0] = base_name;
	if (spdk_nvme_probe(trid, probe_ctx, probe_cb, attach_cb, NULL)) {
		SPDK_ERRLOG("Failed to probe for new devices\n");
		free(probe_ctx);
		return -1;
	}

	nvme_ctrlr = nvme_ctrlr_get(trid);
	if (!nvme_ctrlr) {
		SPDK_ERRLOG("Failed to find new NVMe controller\n");
		free(probe_ctx);
		return -1;
	}

@@ -751,12 +759,14 @@ spdk_bdev_nvme_create(struct spdk_nvme_transport_id *trid,
				j++;
			} else {
				SPDK_ERRLOG("Unable to return all names of created bdevs\n");
				free(probe_ctx);
				return -1;
			}
		}
	}
	*count = j;

	free(probe_ctx);
	return 0;
}

@@ -767,7 +777,7 @@ bdev_nvme_library_init(void)
	const char *val;
	int rc;
	size_t i;
	struct nvme_probe_ctx probe_ctx = {};
	struct nvme_probe_ctx *probe_ctx;
	int retry_count;

	sp = spdk_conf_find_section(NULL, "Nvme");
@@ -775,6 +785,12 @@ bdev_nvme_library_init(void)
		return 0;
	}

	probe_ctx = calloc(1, sizeof(*probe_ctx));
	if (probe_ctx == NULL) {
		SPDK_ERRLOG("Failed to allocate probe_ctx\n");
		return -1;
	}

	if ((retry_count = spdk_conf_section_get_intval(sp, "RetryCount")) < 0) {
		if ((retry_count = spdk_conf_section_get_intval(sp, "NvmeRetryCount")) < 0) {
			retry_count = SPDK_NVME_DEFAULT_RETRY_COUNT;
@@ -792,21 +808,23 @@ bdev_nvme_library_init(void)
			break;
		}

		rc = spdk_nvme_transport_id_parse(&probe_ctx.trids[i], val);
		rc = spdk_nvme_transport_id_parse(&probe_ctx->trids[i], val);
		if (rc < 0) {
			SPDK_ERRLOG("Unable to parse TransportID: %s\n", val);
			free(probe_ctx);
			return -1;
		}

		val = spdk_conf_section_get_nmval(sp, "TransportID", i, 1);
		if (val == NULL) {
			SPDK_ERRLOG("No name provided for TransportID\n");
			free(probe_ctx);
			return -1;
		}

		probe_ctx.names[i] = val;
		probe_ctx->names[i] = val;

		probe_ctx.count++;
		probe_ctx->count++;
	}

	if ((g_timeout = spdk_conf_section_get_intval(sp, "Timeout")) < 0) {
@@ -858,7 +876,8 @@ bdev_nvme_library_init(void)
		g_nvme_hotplug_poll_core = spdk_env_get_current_core();
	}

	if (spdk_nvme_probe(NULL, &probe_ctx, probe_cb, attach_cb, NULL)) {
	if (spdk_nvme_probe(NULL, probe_ctx, probe_cb, attach_cb, NULL)) {
		free(probe_ctx);
		return -1;
	}

@@ -867,6 +886,7 @@ bdev_nvme_library_init(void)
				     g_nvme_hotplug_poll_core, g_nvme_hotplug_poll_timeout_us);
	}

	free(probe_ctx);
	return 0;
}