Loading lib/bdev/nvme/blockdev_nvme.c +27 −29 Original line number Diff line number Diff line Loading @@ -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 { Loading Loading @@ -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); Loading Loading @@ -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) { Loading @@ -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; } } } Loading Loading @@ -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) Loading @@ -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; } Loading Loading @@ -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); } } Loading lib/bdev/nvme/blockdev_nvme.h +0 −2 Original line number Diff line number Diff line Loading @@ -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); Loading lib/bdev/nvme/blockdev_nvme_rpc.c +4 −2 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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; Loading @@ -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; } Loading Loading
lib/bdev/nvme/blockdev_nvme.c +27 −29 Original line number Diff line number Diff line Loading @@ -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 { Loading Loading @@ -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); Loading Loading @@ -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) { Loading @@ -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; } } } Loading Loading @@ -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) Loading @@ -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; } Loading Loading @@ -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); } } Loading
lib/bdev/nvme/blockdev_nvme.h +0 −2 Original line number Diff line number Diff line Loading @@ -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); Loading
lib/bdev/nvme/blockdev_nvme_rpc.c +4 −2 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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; Loading @@ -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; } Loading