Commit c30609c9 authored by Maciej Szwed's avatar Maciej Szwed Committed by Tomasz Zawadzki
Browse files

bdev/nvme: Allow multiple bdevs per namespace



Some future NVMe namespace types will be able to
create multiple bdevs per one namespace. This
patch makes it possible.

Signed-off-by: default avatarMaciej Szwed <maciej.szwed@intel.com>
Change-Id: I47b4c1fc545c59dcc3171ab0960f1835b6aa6d24
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/471620


Community-CI: Broadcom SPDK FC-NVMe CI <spdk-ci.pdl@broadcom.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
parent 77dcf453
Loading
Loading
Loading
Loading
+27 −11
Original line number Diff line number Diff line
@@ -258,6 +258,7 @@ bdev_nvme_destruct(void *ctx)

	pthread_mutex_lock(&g_bdev_nvme_mutex);
	nvme_bdev_ctrlr->ref--;
	TAILQ_REMOVE(&nvme_disk->nvme_ns->bdevs, nvme_disk, tailq);
	free(nvme_disk->disk.name);
	free(nvme_disk);
	if (nvme_bdev_ctrlr->ref == 0 && nvme_bdev_ctrlr->destruct) {
@@ -801,7 +802,7 @@ nvme_ctrlr_create_bdev(struct nvme_bdev_ctrlr *nvme_bdev_ctrlr, struct nvme_bdev
		return rc;
	}

	nvme_ns->bdev = bdev;
	TAILQ_INSERT_TAIL(&nvme_ns->bdevs, bdev, tailq);

	return 0;
}
@@ -937,7 +938,12 @@ timeout_cb(void *cb_arg, struct spdk_nvme_ctrlr *ctrlr,
static void
nvme_ctrlr_deactivate_namespace(struct nvme_bdev_ns *ns)
{
	spdk_bdev_unregister(&ns->bdev->disk, NULL, NULL);
	struct nvme_bdev *bdev, *tmp;

	TAILQ_FOREACH_SAFE(bdev, &ns->bdevs, tailq, tmp) {
		spdk_bdev_unregister(&bdev->disk, NULL, NULL);
	}

	ns->active = false;
}

@@ -958,6 +964,8 @@ nvme_ctrlr_update_ns_bdevs(struct nvme_bdev_ctrlr *nvme_bdev_ctrlr)
			ns->id = nsid;
			ns->ctrlr = nvme_bdev_ctrlr;

			TAILQ_INIT(&ns->bdevs);

			rc = nvme_ctrlr_create_bdev(nvme_bdev_ctrlr, ns);
			if (rc) {
				memset(ns, 0, sizeof(*ns));
@@ -1114,6 +1122,7 @@ remove_cb(void *cb_ctx, struct spdk_nvme_ctrlr *ctrlr)
	uint32_t i;
	struct nvme_bdev_ctrlr *nvme_bdev_ctrlr;
	struct nvme_bdev_ns *ns;
	struct nvme_bdev *nvme_bdev, *tmp;

	pthread_mutex_lock(&g_bdev_nvme_mutex);
	TAILQ_FOREACH(nvme_bdev_ctrlr, &g_nvme_bdev_ctrlrs, tailq) {
@@ -1131,7 +1140,9 @@ remove_cb(void *cb_ctx, struct spdk_nvme_ctrlr *ctrlr)
				if (ns->active) {
					assert(ns->id == nsid);
					ns->active = false;
					spdk_bdev_unregister(&ns->bdev->disk, NULL, NULL);
					TAILQ_FOREACH_SAFE(nvme_bdev, &ns->bdevs, tailq, tmp) {
						spdk_bdev_unregister(&nvme_bdev->disk, NULL, NULL);
					}
				}
			}

@@ -1262,6 +1273,7 @@ bdev_nvme_create_bdevs(struct nvme_async_probe_ctx *ctx, spdk_bdev_create_nvme_f
{
	struct nvme_bdev_ctrlr	*nvme_bdev_ctrlr;
	struct nvme_bdev_ns	*ns;
	struct nvme_bdev	*nvme_bdev, *tmp;
	uint32_t		i, nsid;
	size_t			j;

@@ -1282,8 +1294,9 @@ bdev_nvme_create_bdevs(struct nvme_async_probe_ctx *ctx, spdk_bdev_create_nvme_f
			continue;
		}
		assert(ns->id == nsid);
		TAILQ_FOREACH_SAFE(nvme_bdev, &ns->bdevs, tailq, tmp) {
			if (j < ctx->count) {
			ctx->names[j] = ns->bdev->disk.name;
				ctx->names[j] = nvme_bdev->disk.name;
				j++;
			} else {
				SPDK_ERRLOG("Maximum number of namespaces supported per NVMe controller is %du. Unable to return all names of created bdevs\n",
@@ -1292,6 +1305,7 @@ bdev_nvme_create_bdevs(struct nvme_async_probe_ctx *ctx, spdk_bdev_create_nvme_f
				return;
			}
		}
	}

	cb_fn(cb_arg, j, 0);
}
@@ -1691,6 +1705,8 @@ nvme_ctrlr_create_bdevs(struct nvme_bdev_ctrlr *nvme_bdev_ctrlr)
		ns->id = nsid;
		ns->ctrlr = nvme_bdev_ctrlr;

		TAILQ_INIT(&ns->bdevs);

		rc = nvme_ctrlr_create_bdev(nvme_bdev_ctrlr, ns);
		if (rc == 0) {
			ns->active = true;
+3 −2
Original line number Diff line number Diff line
@@ -49,7 +49,7 @@ struct nvme_bdev_ns {
	bool			active;
	struct spdk_nvme_ns	*ns;
	struct nvme_bdev_ctrlr	*ctrlr;
	struct nvme_bdev	*bdev;
	TAILQ_HEAD(, nvme_bdev)	bdevs;
};

struct nvme_bdev_ctrlr {
@@ -84,8 +84,9 @@ struct nvme_bdev_ctrlr {

struct nvme_bdev {
	struct spdk_bdev	disk;
	struct nvme_bdev_ctrlr	*nvme_bdev_ctrlr;
	struct nvme_bdev_ns	*nvme_ns;
	struct nvme_bdev_ctrlr	*nvme_bdev_ctrlr;
	TAILQ_ENTRY(nvme_bdev)	tailq;
};

typedef void (*spdk_bdev_create_nvme_fn)(void *ctx, size_t bdev_count, int rc);
+5 −1
Original line number Diff line number Diff line
@@ -347,6 +347,7 @@ spdk_vbdev_opal_create(const char *nvme_ctrlr_name, uint32_t nsid, uint8_t locki
	struct spdk_bdev_part *part_bdev;
	SPDK_BDEV_PART_TAILQ *part_tailq;
	struct spdk_vbdev_opal_config *cfg;
	struct nvme_bdev *nvme_bdev;

	if (nsid != NSID_SUPPORTED) {
		SPDK_ERRLOG("nsid %d not supported", nsid);
@@ -389,7 +390,10 @@ spdk_vbdev_opal_create(const char *nvme_ctrlr_name, uint32_t nsid, uint8_t locki
		vbdev_opal_free_bdev(opal_bdev);
		return -EINVAL;
	}
	base_bdev_name = nvme_ctrlr->namespaces[nsid - 1]->bdev->disk.name;

	nvme_bdev = TAILQ_FIRST(&nvme_ctrlr->namespaces[nsid - 1]->bdevs);
	assert(nvme_bdev != NULL);
	base_bdev_name = nvme_bdev->disk.name;

	/* traverse base list to see if part_base is already create for this base bdev */
	TAILQ_FOREACH(opal_part_base, &g_opal_base, tailq) {