bdev: Lift restriction on number of bdevs per NVMe controller
Change-Id: If239803581ca0b1d2b3e5089d634c409269606e2 Signed-off-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
parent
4fa782363a
commit
963777ca36
@ -76,7 +76,8 @@ struct nvme_bdev {
|
|||||||
struct spdk_bdev disk;
|
struct spdk_bdev disk;
|
||||||
struct nvme_ctrlr *nvme_ctrlr;
|
struct nvme_ctrlr *nvme_ctrlr;
|
||||||
struct spdk_nvme_ns *ns;
|
struct spdk_nvme_ns *ns;
|
||||||
bool allocated;
|
|
||||||
|
TAILQ_ENTRY(nvme_bdev) link;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct nvme_io_channel {
|
struct nvme_io_channel {
|
||||||
@ -110,14 +111,14 @@ struct nvme_probe_ctx {
|
|||||||
struct spdk_pci_addr whitelist[NVME_MAX_CONTROLLERS];
|
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 nvme_controller_index = 0;
|
||||||
static int num_controllers = -1;
|
static int num_controllers = -1;
|
||||||
static int g_reset_controller_on_timeout = 0;
|
static int g_reset_controller_on_timeout = 0;
|
||||||
static int g_timeout = 0;
|
static int g_timeout = 0;
|
||||||
static int g_nvme_adminq_poll_timeout_us = 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 void nvme_ctrlr_create_bdevs(struct nvme_ctrlr *nvme_ctrlr, int ctrlr_id);
|
||||||
static int bdev_nvme_library_init(void);
|
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_probe_ctx probe_ctx;
|
||||||
struct nvme_ctrlr *nvme_ctrlr;
|
struct nvme_ctrlr *nvme_ctrlr;
|
||||||
int i;
|
struct nvme_bdev *nvme_bdev;
|
||||||
size_t j;
|
size_t j;
|
||||||
|
|
||||||
if (spdk_pci_addr_parse(&probe_ctx.whitelist[0], trid->traddr) < 0) {
|
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.
|
* 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.
|
* 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++) {
|
j = 0;
|
||||||
if (g_bdev[i].allocated) {
|
TAILQ_FOREACH(nvme_bdev, &g_nvme_bdevs, link) {
|
||||||
if (g_bdev[i].nvme_ctrlr == nvme_ctrlr) {
|
if (nvme_bdev->nvme_ctrlr == nvme_ctrlr) {
|
||||||
names[j] = g_bdev[i].disk.name;
|
if (j < *count) {
|
||||||
|
names[j] = nvme_bdev->disk.name;
|
||||||
j++;
|
j++;
|
||||||
|
} else {
|
||||||
|
assert(false);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -683,29 +688,20 @@ bdev_nvme_library_init(void)
|
|||||||
static void
|
static void
|
||||||
bdev_nvme_library_fini(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)) {
|
TAILQ_FOREACH_SAFE(nvme_bdev, &g_nvme_bdevs, link, btmp) {
|
||||||
dev = TAILQ_FIRST(&g_nvme_ctrlrs);
|
TAILQ_REMOVE(&g_nvme_bdevs, nvme_bdev, link);
|
||||||
TAILQ_REMOVE(&g_nvme_ctrlrs, dev, tailq);
|
free(nvme_bdev);
|
||||||
spdk_poller_unregister(&dev->adminq_timer_poller, NULL);
|
|
||||||
spdk_nvme_detach(dev->ctrlr);
|
|
||||||
free(dev);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
static struct nvme_bdev *
|
TAILQ_FOREACH_SAFE(nvme_ctrlr, &g_nvme_ctrlrs, tailq, ctmp) {
|
||||||
nvme_bdev_alloc(void)
|
TAILQ_REMOVE(&g_nvme_ctrlrs, nvme_ctrlr, tailq);
|
||||||
{
|
spdk_poller_unregister(&nvme_ctrlr->adminq_timer_poller, NULL);
|
||||||
int i;
|
spdk_nvme_detach(nvme_ctrlr->ctrlr);
|
||||||
|
free(nvme_ctrlr);
|
||||||
for (i = 0; i < NVME_MAX_BLOCKDEVS; i++) {
|
|
||||||
if (g_bdev[i].allocated == false) {
|
|
||||||
g_bdev[i].allocated = true;
|
|
||||||
return &g_bdev[i];
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -728,8 +724,8 @@ nvme_ctrlr_create_bdevs(struct nvme_ctrlr *nvme_ctrlr, int ctrlr_id)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
bdev = nvme_bdev_alloc();
|
bdev = calloc(1, sizeof(*bdev));
|
||||||
if (bdev == NULL) {
|
if (!bdev) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -761,6 +757,8 @@ nvme_ctrlr_create_bdevs(struct nvme_ctrlr *nvme_ctrlr, int ctrlr_id)
|
|||||||
bdev->disk.ctxt = bdev;
|
bdev->disk.ctxt = bdev;
|
||||||
bdev->disk.fn_table = &nvmelib_fn_table;
|
bdev->disk.fn_table = &nvmelib_fn_table;
|
||||||
spdk_bdev_register(&bdev->disk);
|
spdk_bdev_register(&bdev->disk);
|
||||||
|
|
||||||
|
TAILQ_INSERT_TAIL(&g_nvme_bdevs, bdev, link);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,8 +39,6 @@
|
|||||||
#include "spdk/nvme.h"
|
#include "spdk/nvme.h"
|
||||||
|
|
||||||
#define NVME_MAX_CONTROLLERS 16
|
#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,
|
int spdk_bdev_nvme_create(struct spdk_nvme_transport_id *trid,
|
||||||
const char **names, size_t *count);
|
const char **names, size_t *count);
|
||||||
|
@ -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},
|
{"pci_address", offsetof(struct rpc_construct_nvme, pci_address), spdk_json_decode_string},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define NVME_MAX_BLOCKDEVS_PER_RPC 32
|
||||||
|
|
||||||
static void
|
static void
|
||||||
spdk_rpc_construct_nvme_bdev(struct spdk_jsonrpc_server_conn *conn,
|
spdk_rpc_construct_nvme_bdev(struct spdk_jsonrpc_server_conn *conn,
|
||||||
const struct spdk_json_val *params,
|
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 rpc_construct_nvme req = {};
|
||||||
struct spdk_json_write_ctx *w;
|
struct spdk_json_write_ctx *w;
|
||||||
struct spdk_nvme_transport_id trid = {};
|
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 count = 0;
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
@ -74,7 +76,7 @@ spdk_rpc_construct_nvme_bdev(struct spdk_jsonrpc_server_conn *conn,
|
|||||||
trid.trtype = SPDK_NVME_TRANSPORT_PCIE;
|
trid.trtype = SPDK_NVME_TRANSPORT_PCIE;
|
||||||
snprintf(trid.traddr, sizeof(trid.traddr), "%s", req.pci_address);
|
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)) {
|
if (spdk_bdev_nvme_create(&trid, names, &count)) {
|
||||||
goto invalid;
|
goto invalid;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user