Commit 67196e99 authored by Ben Walker's avatar Ben Walker Committed by Tomasz Zawadzki
Browse files

nvme: Don't free and allocate the entire ns array in


nvme_ctrlr_construct_namespaces

We can just reallocate here to be more efficient.

Signed-off-by: default avatarBen Walker <benjamin.walker@intel.com>
Change-Id: I8cfc87da23aee6c05ff83aea2165683dddba1dbd
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/10688


Community-CI: Mellanox Build Bot
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@mellanox.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent fca42629
Loading
Loading
Loading
Loading
+16 −18
Original line number Diff line number Diff line
@@ -2991,27 +2991,26 @@ nvme_ctrlr_construct_namespaces(struct spdk_nvme_ctrlr *ctrlr)
{
	int rc = 0;
	uint32_t i, nn = ctrlr->cdata.nn;
	struct spdk_nvme_ns *tmp;

	/* ctrlr->num_ns may be 0 (startup) or a different number of namespaces (reset),
	 * so check if we need to reallocate.
	 */
	if (nn != ctrlr->num_ns) {
		nvme_ctrlr_destruct_namespaces(ctrlr);

		if (nn == 0) {
			NVME_CTRLR_WARNLOG(ctrlr, "controller has 0 namespaces\n");
			return 0;
		}

		ctrlr->ns = spdk_zmalloc(nn * sizeof(struct spdk_nvme_ns), 64, NULL,
					 SPDK_ENV_SOCKET_ID_ANY, SPDK_MALLOC_SHARE);
		if (ctrlr->ns == NULL) {
		tmp = spdk_realloc(ctrlr->ns, nn * sizeof(struct spdk_nvme_ns), 64);
		if (tmp == NULL) {
			rc = -ENOMEM;
			goto fail;
		}

		if (nn > ctrlr->num_ns) {
			memset(tmp + ctrlr->num_ns, 0, (nn - ctrlr->num_ns) * sizeof(struct spdk_nvme_ns));
		}

		ctrlr->ns = tmp;
		ctrlr->num_ns = nn;
	} else {
	}

	/*
	 * The controller could have been reset with the same number of namespaces.
	 * If so, we still need to free the iocs specific data, to get a clean slate.
@@ -3019,7 +3018,6 @@ nvme_ctrlr_construct_namespaces(struct spdk_nvme_ctrlr *ctrlr)
	for (i = 0; i < ctrlr->num_ns; i++) {
		nvme_ns_free_iocs_specific_data(&ctrlr->ns[i]);
	}
	}

	return 0;