Commit 963777ca authored by Ben Walker's avatar Ben Walker Committed by Jim Harris
Browse files

bdev: Lift restriction on number of bdevs per NVMe controller



Change-Id: If239803581ca0b1d2b3e5089d634c409269606e2
Signed-off-by: default avatarBen Walker <benjamin.walker@intel.com>
parent 4fa78236
Loading
Loading
Loading
Loading
+27 −29
Original line number Diff line number Diff line
@@ -76,7 +76,8 @@ struct nvme_bdev {
	struct spdk_bdev	disk;
	struct nvme_ctrlr	*nvme_ctrlr;
	struct spdk_nvme_ns	*ns;
	bool			allocated;

	TAILQ_ENTRY(nvme_bdev)	link;
};

struct nvme_io_channel {
@@ -110,14 +111,14 @@ struct nvme_probe_ctx {
	struct spdk_pci_addr whitelist[NVME_MAX_CONTROLLERS];
};

static struct nvme_bdev g_bdev[NVME_MAX_BLOCKDEVS];
static int nvme_controller_index = 0;
static int num_controllers = -1;
static int g_reset_controller_on_timeout = 0;
static int g_timeout = 0;
static int g_nvme_adminq_poll_timeout_us = 0;

static TAILQ_HEAD(, nvme_ctrlr)	g_nvme_ctrlrs = TAILQ_HEAD_INITIALIZER(g_nvme_ctrlrs);;
static TAILQ_HEAD(, nvme_ctrlr)	g_nvme_ctrlrs = TAILQ_HEAD_INITIALIZER(g_nvme_ctrlrs);
static TAILQ_HEAD(, nvme_bdev) g_nvme_bdevs = TAILQ_HEAD_INITIALIZER(g_nvme_bdevs);

static void nvme_ctrlr_create_bdevs(struct nvme_ctrlr *nvme_ctrlr, int ctrlr_id);
static int bdev_nvme_library_init(void);
@@ -569,7 +570,7 @@ spdk_bdev_nvme_create(struct spdk_nvme_transport_id *trid,
{
	struct nvme_probe_ctx	probe_ctx;
	struct nvme_ctrlr	*nvme_ctrlr;
	int			i;
	struct nvme_bdev	*nvme_bdev;
	size_t			j;

	if (spdk_pci_addr_parse(&probe_ctx.whitelist[0], trid->traddr) < 0) {
@@ -595,11 +596,15 @@ spdk_bdev_nvme_create(struct spdk_nvme_transport_id *trid,
	 * Report the new bdevs that were created in this call.
	 * There can be more than one bdev per NVMe controller since one bdev is created per namespace.
	 */
	for (j = 0, i = 0; i < NVME_MAX_BLOCKDEVS; i++) {
		if (g_bdev[i].allocated) {
			if (g_bdev[i].nvme_ctrlr == nvme_ctrlr) {
				names[j] = g_bdev[i].disk.name;
	j = 0;
	TAILQ_FOREACH(nvme_bdev, &g_nvme_bdevs, link) {
		if (nvme_bdev->nvme_ctrlr == nvme_ctrlr) {
			if (j < *count) {
				names[j] = nvme_bdev->disk.name;
				j++;
			} else {
				assert(false);
				break;
			}
		}
	}
@@ -683,30 +688,21 @@ bdev_nvme_library_init(void)
static void
bdev_nvme_library_fini(void)
{
	struct nvme_ctrlr *dev;
	struct nvme_ctrlr *nvme_ctrlr, *ctmp;
	struct nvme_bdev *nvme_bdev, *btmp;

	while (!TAILQ_EMPTY(&g_nvme_ctrlrs)) {
		dev = TAILQ_FIRST(&g_nvme_ctrlrs);
		TAILQ_REMOVE(&g_nvme_ctrlrs, dev, tailq);
		spdk_poller_unregister(&dev->adminq_timer_poller, NULL);
		spdk_nvme_detach(dev->ctrlr);
		free(dev);
	}
	TAILQ_FOREACH_SAFE(nvme_bdev, &g_nvme_bdevs, link, btmp) {
		TAILQ_REMOVE(&g_nvme_bdevs, nvme_bdev, link);
		free(nvme_bdev);
	}

static struct nvme_bdev *
nvme_bdev_alloc(void)
{
	int i;

	for (i = 0; i < NVME_MAX_BLOCKDEVS; i++) {
		if (g_bdev[i].allocated == false) {
			g_bdev[i].allocated = true;
			return &g_bdev[i];
	TAILQ_FOREACH_SAFE(nvme_ctrlr, &g_nvme_ctrlrs, tailq, ctmp) {
		TAILQ_REMOVE(&g_nvme_ctrlrs, nvme_ctrlr, tailq);
		spdk_poller_unregister(&nvme_ctrlr->adminq_timer_poller, NULL);
		spdk_nvme_detach(nvme_ctrlr->ctrlr);
		free(nvme_ctrlr);
	}
}
	return NULL;
}

static void
nvme_ctrlr_create_bdevs(struct nvme_ctrlr *nvme_ctrlr, int ctrlr_id)
@@ -728,8 +724,8 @@ nvme_ctrlr_create_bdevs(struct nvme_ctrlr *nvme_ctrlr, int ctrlr_id)
			continue;
		}

		bdev = nvme_bdev_alloc();
		if (bdev == NULL) {
		bdev = calloc(1, sizeof(*bdev));
		if (!bdev) {
			return;
		}

@@ -761,6 +757,8 @@ nvme_ctrlr_create_bdevs(struct nvme_ctrlr *nvme_ctrlr, int ctrlr_id)
		bdev->disk.ctxt = bdev;
		bdev->disk.fn_table = &nvmelib_fn_table;
		spdk_bdev_register(&bdev->disk);

		TAILQ_INSERT_TAIL(&g_nvme_bdevs, bdev, link);
	}
}

+0 −2
Original line number Diff line number Diff line
@@ -39,8 +39,6 @@
#include "spdk/nvme.h"

#define NVME_MAX_CONTROLLERS 16
#define NVME_MAX_BLOCKDEVS_PER_CONTROLLER 256
#define NVME_MAX_BLOCKDEVS (NVME_MAX_BLOCKDEVS_PER_CONTROLLER * NVME_MAX_CONTROLLERS)

int spdk_bdev_nvme_create(struct spdk_nvme_transport_id *trid,
			  const char **names, size_t *count);
+4 −2
Original line number Diff line number Diff line
@@ -52,6 +52,8 @@ static const struct spdk_json_object_decoder rpc_construct_nvme_decoders[] = {
	{"pci_address", offsetof(struct rpc_construct_nvme, pci_address), spdk_json_decode_string},
};

#define NVME_MAX_BLOCKDEVS_PER_RPC 32

static void
spdk_rpc_construct_nvme_bdev(struct spdk_jsonrpc_server_conn *conn,
			     const struct spdk_json_val *params,
@@ -60,7 +62,7 @@ spdk_rpc_construct_nvme_bdev(struct spdk_jsonrpc_server_conn *conn,
	struct rpc_construct_nvme req = {};
	struct spdk_json_write_ctx *w;
	struct spdk_nvme_transport_id trid = {};
	const char *names[NVME_MAX_BLOCKDEVS];
	const char *names[NVME_MAX_BLOCKDEVS_PER_RPC];
	size_t count = 0;
	size_t i;

@@ -74,7 +76,7 @@ spdk_rpc_construct_nvme_bdev(struct spdk_jsonrpc_server_conn *conn,
	trid.trtype = SPDK_NVME_TRANSPORT_PCIE;
	snprintf(trid.traddr, sizeof(trid.traddr), "%s", req.pci_address);

	count = NVME_MAX_BLOCKDEVS;
	count = NVME_MAX_BLOCKDEVS_PER_RPC;
	if (spdk_bdev_nvme_create(&trid, names, &count)) {
		goto invalid;
	}