Loading lib/bdev/nvme/blockdev_nvme.c +151 −150 Original line number Diff line number Diff line Loading @@ -53,9 +53,9 @@ #include "spdk_internal/bdev.h" #include "spdk_internal/log.h" static void blockdev_nvme_get_spdk_running_config(FILE *fp); static void bdev_nvme_get_spdk_running_config(FILE *fp); struct nvme_device { struct nvme_ctrlr { /** * points to pinned, physically contiguous memory region; * contains 4KB IDENTIFY structure for controller which is Loading @@ -67,15 +67,14 @@ struct nvme_device { struct spdk_poller *adminq_timer_poller; /** linked list pointer for device list */ TAILQ_ENTRY(nvme_device) tailq; TAILQ_ENTRY(nvme_ctrlr) tailq; int id; }; struct nvme_blockdev { struct nvme_bdev { struct spdk_bdev disk; struct spdk_nvme_ctrlr *ctrlr; struct nvme_device *dev; struct nvme_ctrlr *nvme_ctrlr; struct spdk_nvme_ns *ns; bool allocated; }; Loading @@ -86,7 +85,7 @@ struct nvme_io_channel { }; #define NVME_DEFAULT_MAX_UNMAP_BDESC_COUNT 1 struct nvme_blockio { struct nvme_bdev_io { /** array of iovecs to transfer. */ struct iovec *iovs; Loading @@ -111,36 +110,36 @@ struct nvme_probe_ctx { struct spdk_pci_addr whitelist[NVME_MAX_CONTROLLERS]; }; static struct nvme_blockdev g_blockdev[NVME_MAX_BLOCKDEVS]; 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_device) g_nvme_devices = TAILQ_HEAD_INITIALIZER(g_nvme_devices);; static TAILQ_HEAD(, nvme_ctrlr) g_nvme_ctrlrs = TAILQ_HEAD_INITIALIZER(g_nvme_ctrlrs);; static void nvme_ctrlr_initialize_blockdevs(struct nvme_device *nvme_dev, int ctrlr_id); static int nvme_library_init(void); static void nvme_library_fini(void); static int nvme_queue_cmd(struct nvme_blockdev *bdev, struct spdk_nvme_qpair *qpair, struct nvme_blockio *bio, static void nvme_ctrlr_create_bdevs(struct nvme_ctrlr *nvme_ctrlr, int ctrlr_id); static int bdev_nvme_library_init(void); static void bdev_nvme_library_fini(void); static int bdev_nvme_queue_cmd(struct nvme_bdev *bdev, struct spdk_nvme_qpair *qpair, struct nvme_bdev_io *bio, int direction, struct iovec *iov, int iovcnt, uint64_t nbytes, uint64_t offset); static int nvme_get_ctx_size(void) bdev_nvme_get_ctx_size(void) { return sizeof(struct nvme_blockio); return sizeof(struct nvme_bdev_io); } SPDK_BDEV_MODULE_REGISTER(nvme_library_init, nvme_library_fini, blockdev_nvme_get_spdk_running_config, nvme_get_ctx_size) SPDK_BDEV_MODULE_REGISTER(bdev_nvme_library_init, bdev_nvme_library_fini, bdev_nvme_get_spdk_running_config, bdev_nvme_get_ctx_size) static int64_t blockdev_nvme_readv(struct nvme_blockdev *nbdev, struct spdk_io_channel *ch, struct nvme_blockio *bio, bdev_nvme_readv(struct nvme_bdev *nbdev, struct spdk_io_channel *ch, struct nvme_bdev_io *bio, struct iovec *iov, int iovcnt, uint64_t nbytes, uint64_t offset) { struct nvme_io_channel *nvme_ch = spdk_io_channel_get_ctx(ch); Loading @@ -149,7 +148,7 @@ blockdev_nvme_readv(struct nvme_blockdev *nbdev, struct spdk_io_channel *ch, SPDK_TRACELOG(SPDK_TRACE_BDEV_NVME, "read %lu bytes with offset %#lx\n", nbytes, offset); rc = nvme_queue_cmd(nbdev, nvme_ch->qpair, bio, BDEV_DISK_READ, rc = bdev_nvme_queue_cmd(nbdev, nvme_ch->qpair, bio, BDEV_DISK_READ, iov, iovcnt, nbytes, offset); if (rc < 0) return -1; Loading @@ -158,8 +157,8 @@ blockdev_nvme_readv(struct nvme_blockdev *nbdev, struct spdk_io_channel *ch, } static int64_t blockdev_nvme_writev(struct nvme_blockdev *nbdev, struct spdk_io_channel *ch, struct nvme_blockio *bio, bdev_nvme_writev(struct nvme_bdev *nbdev, struct spdk_io_channel *ch, struct nvme_bdev_io *bio, struct iovec *iov, int iovcnt, size_t len, uint64_t offset) { struct nvme_io_channel *nvme_ch = spdk_io_channel_get_ctx(ch); Loading @@ -168,7 +167,7 @@ blockdev_nvme_writev(struct nvme_blockdev *nbdev, struct spdk_io_channel *ch, SPDK_TRACELOG(SPDK_TRACE_BDEV_NVME, "write %lu bytes with offset %#lx\n", len, offset); rc = nvme_queue_cmd(nbdev, nvme_ch->qpair, bio, BDEV_DISK_WRITE, rc = bdev_nvme_queue_cmd(nbdev, nvme_ch->qpair, bio, BDEV_DISK_WRITE, iov, iovcnt, len, offset); if (rc < 0) return -1; Loading @@ -177,7 +176,7 @@ blockdev_nvme_writev(struct nvme_blockdev *nbdev, struct spdk_io_channel *ch, } static void blockdev_nvme_poll(void *arg) bdev_nvme_poll(void *arg) { struct spdk_nvme_qpair *qpair = arg; Loading @@ -185,7 +184,7 @@ blockdev_nvme_poll(void *arg) } static void blockdev_nvme_poll_adminq(void *arg) bdev_nvme_poll_adminq(void *arg) { struct spdk_nvme_ctrlr *ctrlr = arg; Loading @@ -193,13 +192,13 @@ blockdev_nvme_poll_adminq(void *arg) } static int blockdev_nvme_destruct(struct spdk_bdev *bdev) bdev_nvme_destruct(struct spdk_bdev *bdev) { return 0; } static int blockdev_nvme_flush(struct nvme_blockdev *nbdev, struct nvme_blockio *bio, bdev_nvme_flush(struct nvme_bdev *nbdev, struct nvme_bdev_io *bio, uint64_t offset, uint64_t nbytes) { spdk_bdev_io_complete(spdk_bdev_io_from_ctx(bio), SPDK_BDEV_IO_STATUS_SUCCESS); Loading @@ -208,13 +207,13 @@ blockdev_nvme_flush(struct nvme_blockdev *nbdev, struct nvme_blockio *bio, } static int blockdev_nvme_reset(struct nvme_blockdev *nbdev, struct nvme_blockio *bio) bdev_nvme_reset(struct nvme_bdev *nbdev, struct nvme_bdev_io *bio) { int rc; enum spdk_bdev_io_status status; status = SPDK_BDEV_IO_STATUS_SUCCESS; rc = spdk_nvme_ctrlr_reset(nbdev->ctrlr); rc = spdk_nvme_ctrlr_reset(nbdev->nvme_ctrlr->ctrlr); if (rc != 0) { status = SPDK_BDEV_IO_STATUS_FAILED; } Loading @@ -224,18 +223,19 @@ blockdev_nvme_reset(struct nvme_blockdev *nbdev, struct nvme_blockio *bio) } static int blockdev_nvme_unmap(struct nvme_blockdev *nbdev, struct spdk_io_channel *ch, struct nvme_blockio *bio, bdev_nvme_unmap(struct nvme_bdev *nbdev, struct spdk_io_channel *ch, struct nvme_bdev_io *bio, struct spdk_scsi_unmap_bdesc *umap_d, uint16_t bdesc_count); static void blockdev_nvme_get_rbuf_cb(struct spdk_bdev_io *bdev_io) static void bdev_nvme_get_rbuf_cb(struct spdk_bdev_io *bdev_io) { int ret; ret = blockdev_nvme_readv((struct nvme_blockdev *)bdev_io->ctx, ret = bdev_nvme_readv((struct nvme_bdev *)bdev_io->ctx, bdev_io->ch, (struct nvme_blockio *)bdev_io->driver_ctx, (struct nvme_bdev_io *)bdev_io->driver_ctx, bdev_io->u.read.iovs, bdev_io->u.read.iovcnt, bdev_io->u.read.len, Loading @@ -246,36 +246,37 @@ static void blockdev_nvme_get_rbuf_cb(struct spdk_bdev_io *bdev_io) } } static int _blockdev_nvme_submit_request(struct spdk_bdev_io *bdev_io) static int _bdev_nvme_submit_request(struct spdk_bdev_io *bdev_io) { switch (bdev_io->type) { case SPDK_BDEV_IO_TYPE_READ: spdk_bdev_io_get_rbuf(bdev_io, blockdev_nvme_get_rbuf_cb); spdk_bdev_io_get_rbuf(bdev_io, bdev_nvme_get_rbuf_cb); return 0; case SPDK_BDEV_IO_TYPE_WRITE: return blockdev_nvme_writev((struct nvme_blockdev *)bdev_io->ctx, return bdev_nvme_writev((struct nvme_bdev *)bdev_io->ctx, bdev_io->ch, (struct nvme_blockio *)bdev_io->driver_ctx, (struct nvme_bdev_io *)bdev_io->driver_ctx, bdev_io->u.write.iovs, bdev_io->u.write.iovcnt, bdev_io->u.write.len, bdev_io->u.write.offset); case SPDK_BDEV_IO_TYPE_UNMAP: return blockdev_nvme_unmap((struct nvme_blockdev *)bdev_io->ctx, return bdev_nvme_unmap((struct nvme_bdev *)bdev_io->ctx, bdev_io->ch, (struct nvme_blockio *)bdev_io->driver_ctx, (struct nvme_bdev_io *)bdev_io->driver_ctx, bdev_io->u.unmap.unmap_bdesc, bdev_io->u.unmap.bdesc_count); case SPDK_BDEV_IO_TYPE_RESET: return blockdev_nvme_reset((struct nvme_blockdev *)bdev_io->ctx, (struct nvme_blockio *)bdev_io->driver_ctx); return bdev_nvme_reset((struct nvme_bdev *)bdev_io->ctx, (struct nvme_bdev_io *)bdev_io->driver_ctx); case SPDK_BDEV_IO_TYPE_FLUSH: return blockdev_nvme_flush((struct nvme_blockdev *)bdev_io->ctx, (struct nvme_blockio *)bdev_io->driver_ctx, return bdev_nvme_flush((struct nvme_bdev *)bdev_io->ctx, (struct nvme_bdev_io *)bdev_io->driver_ctx, bdev_io->u.flush.offset, bdev_io->u.flush.length); Loading @@ -285,17 +286,18 @@ static int _blockdev_nvme_submit_request(struct spdk_bdev_io *bdev_io) return 0; } static void blockdev_nvme_submit_request(struct spdk_bdev_io *bdev_io) static void bdev_nvme_submit_request(struct spdk_bdev_io *bdev_io) { if (_blockdev_nvme_submit_request(bdev_io) < 0) { if (_bdev_nvme_submit_request(bdev_io) < 0) { spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_FAILED); } } static bool blockdev_nvme_io_type_supported(struct spdk_bdev *bdev, enum spdk_bdev_io_type io_type) bdev_nvme_io_type_supported(struct spdk_bdev *bdev, enum spdk_bdev_io_type io_type) { struct nvme_blockdev *nbdev = (struct nvme_blockdev *)bdev; struct nvme_bdev *nbdev = (struct nvme_bdev *)bdev; const struct spdk_nvme_ctrlr_data *cdata; switch (io_type) { Loading @@ -306,7 +308,7 @@ blockdev_nvme_io_type_supported(struct spdk_bdev *bdev, enum spdk_bdev_io_type i return true; case SPDK_BDEV_IO_TYPE_UNMAP: cdata = spdk_nvme_ctrlr_get_data(nbdev->ctrlr); cdata = spdk_nvme_ctrlr_get_data(nbdev->nvme_ctrlr->ctrlr); return cdata->oncs.dsm; default: Loading @@ -315,7 +317,7 @@ blockdev_nvme_io_type_supported(struct spdk_bdev *bdev, enum spdk_bdev_io_type i } static int blockdev_nvme_create_cb(void *io_device, uint32_t priority, void *ctx_buf, void *unique_ctx) bdev_nvme_create_cb(void *io_device, uint32_t priority, void *ctx_buf, void *unique_ctx) { struct spdk_nvme_ctrlr *ctrlr = io_device; struct nvme_io_channel *ch = ctx_buf; Loading @@ -326,13 +328,13 @@ blockdev_nvme_create_cb(void *io_device, uint32_t priority, void *ctx_buf, void return -1; } spdk_poller_register(&ch->poller, blockdev_nvme_poll, ch->qpair, spdk_poller_register(&ch->poller, bdev_nvme_poll, ch->qpair, spdk_app_get_current_core(), 0); return 0; } static void blockdev_nvme_destroy_cb(void *io_device, void *ctx_buf) bdev_nvme_destroy_cb(void *io_device, void *ctx_buf) { struct nvme_io_channel *ch = ctx_buf; Loading @@ -341,36 +343,36 @@ blockdev_nvme_destroy_cb(void *io_device, void *ctx_buf) } static struct spdk_io_channel * blockdev_nvme_get_io_channel(struct spdk_bdev *bdev, uint32_t priority) bdev_nvme_get_io_channel(struct spdk_bdev *bdev, uint32_t priority) { struct nvme_blockdev *nvme_bdev = (struct nvme_blockdev *)bdev; struct nvme_bdev *nvme_bdev = (struct nvme_bdev *)bdev; return spdk_get_io_channel(nvme_bdev->ctrlr, priority, false, NULL); return spdk_get_io_channel(nvme_bdev->nvme_ctrlr->ctrlr, priority, false, NULL); } static int blockdev_nvme_dump_config_json(struct spdk_bdev *bdev, struct spdk_json_write_ctx *w) bdev_nvme_dump_config_json(struct spdk_bdev *bdev, struct spdk_json_write_ctx *w) { struct nvme_blockdev *nvme_bdev = (struct nvme_blockdev *)bdev; struct nvme_device *nvme_dev = nvme_bdev->dev; struct nvme_bdev *nvme_bdev = (struct nvme_bdev *)bdev; struct nvme_ctrlr *nvme_ctrlr = nvme_bdev->nvme_ctrlr; const struct spdk_nvme_ctrlr_data *cdata; struct spdk_nvme_ns *ns; union spdk_nvme_vs_register vs; union spdk_nvme_csts_register csts; char buf[128]; cdata = spdk_nvme_ctrlr_get_data(nvme_bdev->ctrlr); vs = spdk_nvme_ctrlr_get_regs_vs(nvme_bdev->ctrlr); csts = spdk_nvme_ctrlr_get_regs_csts(nvme_bdev->ctrlr); cdata = spdk_nvme_ctrlr_get_data(nvme_bdev->nvme_ctrlr->ctrlr); vs = spdk_nvme_ctrlr_get_regs_vs(nvme_bdev->nvme_ctrlr->ctrlr); csts = spdk_nvme_ctrlr_get_regs_csts(nvme_bdev->nvme_ctrlr->ctrlr); ns = nvme_bdev->ns; spdk_json_write_name(w, "nvme"); spdk_json_write_object_begin(w); spdk_json_write_name(w, "pci_address"); spdk_json_write_string_fmt(w, "%04x:%02x:%02x.%x", nvme_dev->pci_addr.domain, nvme_dev->pci_addr.bus, nvme_dev->pci_addr.dev, nvme_dev->pci_addr.func); spdk_json_write_string_fmt(w, "%04x:%02x:%02x.%x", nvme_ctrlr->pci_addr.domain, nvme_ctrlr->pci_addr.bus, nvme_ctrlr->pci_addr.dev, nvme_ctrlr->pci_addr.func); spdk_json_write_name(w, "ctrlr_data"); spdk_json_write_object_begin(w); Loading Loading @@ -449,11 +451,11 @@ blockdev_nvme_dump_config_json(struct spdk_bdev *bdev, struct spdk_json_write_ct } static const struct spdk_bdev_fn_table nvmelib_fn_table = { .destruct = blockdev_nvme_destruct, .submit_request = blockdev_nvme_submit_request, .io_type_supported = blockdev_nvme_io_type_supported, .get_io_channel = blockdev_nvme_get_io_channel, .dump_config_json = blockdev_nvme_dump_config_json, .destruct = bdev_nvme_destruct, .submit_request = bdev_nvme_submit_request, .io_type_supported = bdev_nvme_io_type_supported, .get_io_channel = bdev_nvme_get_io_channel, .dump_config_json = bdev_nvme_dump_config_json, }; static bool Loading Loading @@ -502,7 +504,7 @@ probe_cb(void *cb_ctx, const struct spdk_nvme_transport_id *trid, } static void blockdev_nvme_timeout_cb(void *cb_arg, struct spdk_nvme_ctrlr *ctrlr, timeout_cb(void *cb_arg, struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qpair *qpair, uint16_t cid) { int rc; Loading @@ -519,9 +521,9 @@ static void attach_cb(void *cb_ctx, const struct spdk_nvme_transport_id *trid, struct spdk_nvme_ctrlr *ctrlr, const struct spdk_nvme_ctrlr_opts *opts) { struct nvme_device *dev; struct nvme_ctrlr *dev; dev = malloc(sizeof(struct nvme_device)); dev = malloc(sizeof(struct nvme_ctrlr)); if (dev == NULL) { SPDK_ERRLOG("Failed to allocate device struct\n"); return; Loading @@ -532,28 +534,28 @@ attach_cb(void *cb_ctx, const struct spdk_nvme_transport_id *trid, spdk_pci_addr_parse(&dev->pci_addr, trid->traddr); dev->id = nvme_controller_index++; nvme_ctrlr_initialize_blockdevs(dev, dev->id); nvme_ctrlr_create_bdevs(dev, dev->id); spdk_poller_register(&dev->adminq_timer_poller, blockdev_nvme_poll_adminq, ctrlr, spdk_poller_register(&dev->adminq_timer_poller, bdev_nvme_poll_adminq, ctrlr, spdk_app_get_current_core(), g_nvme_adminq_poll_timeout_us); spdk_io_device_register(ctrlr, blockdev_nvme_create_cb, blockdev_nvme_destroy_cb, spdk_io_device_register(ctrlr, bdev_nvme_create_cb, bdev_nvme_destroy_cb, sizeof(struct nvme_io_channel)); TAILQ_INSERT_TAIL(&g_nvme_devices, dev, tailq); TAILQ_INSERT_TAIL(&g_nvme_ctrlrs, dev, tailq); if (g_reset_controller_on_timeout) { spdk_nvme_ctrlr_register_timeout_callback(ctrlr, g_timeout, blockdev_nvme_timeout_cb, NULL); timeout_cb, NULL); } } static bool spdk_bdev_nvme_exists(struct spdk_pci_addr *addr) nvme_ctrlr_exists(struct spdk_pci_addr *addr) { struct nvme_device *nvme_dev; struct nvme_ctrlr *nvme_ctrlr; TAILQ_FOREACH(nvme_dev, &g_nvme_devices, tailq) { if (spdk_pci_addr_compare(&nvme_dev->pci_addr, addr) == 0) { TAILQ_FOREACH(nvme_ctrlr, &g_nvme_ctrlrs, tailq) { if (spdk_pci_addr_compare(&nvme_ctrlr->pci_addr, addr) == 0) { return true; } } Loading @@ -575,7 +577,7 @@ spdk_bdev_nvme_create(struct spdk_nvme_transport_id *trid, probe_ctx.num_whitelist_controllers = 1; probe_ctx.controllers_remaining = 1; if (spdk_bdev_nvme_exists(&probe_ctx.whitelist[0])) { if (nvme_ctrlr_exists(&probe_ctx.whitelist[0])) { return -1; } Loading @@ -588,9 +590,9 @@ spdk_bdev_nvme_create(struct spdk_nvme_transport_id *trid, * 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_blockdev[i].allocated) { if (spdk_pci_addr_compare(&probe_ctx.whitelist[0], &g_blockdev[i].dev->pci_addr) == 0) { names[j] = g_blockdev[i].disk.name; if (g_bdev[i].allocated) { if (spdk_pci_addr_compare(&probe_ctx.whitelist[0], &g_bdev[i].nvme_ctrlr->pci_addr) == 0) { names[j] = g_bdev[i].disk.name; j++; } } Loading @@ -601,7 +603,7 @@ spdk_bdev_nvme_create(struct spdk_nvme_transport_id *trid, } static int nvme_library_init(void) bdev_nvme_library_init(void) { struct spdk_conf_section *sp; const char *val; Loading Loading @@ -673,38 +675,38 @@ nvme_library_init(void) } static void nvme_library_fini(void) bdev_nvme_library_fini(void) { struct nvme_device *dev; struct nvme_ctrlr *dev; while (!TAILQ_EMPTY(&g_nvme_devices)) { dev = TAILQ_FIRST(&g_nvme_devices); TAILQ_REMOVE(&g_nvme_devices, dev, tailq); 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); } } static struct nvme_blockdev * allocate_nvme_blockdev(void) static struct nvme_bdev * nvme_bdev_alloc(void) { int i; for (i = 0; i < NVME_MAX_BLOCKDEVS; i++) { if (g_blockdev[i].allocated == false) { g_blockdev[i].allocated = true; return &g_blockdev[i]; if (g_bdev[i].allocated == false) { g_bdev[i].allocated = true; return &g_bdev[i]; } } return NULL; } static void nvme_ctrlr_initialize_blockdevs(struct nvme_device *nvme_dev, int ctrlr_id) nvme_ctrlr_create_bdevs(struct nvme_ctrlr *nvme_ctrlr, int ctrlr_id) { struct nvme_blockdev *bdev; struct spdk_nvme_ctrlr *ctrlr = nvme_dev->ctrlr; struct nvme_bdev *bdev; struct spdk_nvme_ctrlr *ctrlr = nvme_ctrlr->ctrlr; struct spdk_nvme_ns *ns; const struct spdk_nvme_ctrlr_data *cdata; int ns_id, num_ns; Loading @@ -720,13 +722,12 @@ nvme_ctrlr_initialize_blockdevs(struct nvme_device *nvme_dev, int ctrlr_id) continue; } bdev = allocate_nvme_blockdev(); bdev = nvme_bdev_alloc(); if (bdev == NULL) { return; } bdev->ctrlr = ctrlr; bdev->dev = nvme_dev; bdev->nvme_ctrlr = nvme_ctrlr; bdev->ns = ns; snprintf(bdev->disk.name, SPDK_BDEV_MAX_NAME_LENGTH, Loading Loading @@ -758,17 +759,17 @@ nvme_ctrlr_initialize_blockdevs(struct nvme_device *nvme_dev, int ctrlr_id) } static void queued_done(void *ref, const struct spdk_nvme_cpl *cpl) bdev_nvme_queued_done(void *ref, const struct spdk_nvme_cpl *cpl) { struct spdk_bdev_io *bdev_io = spdk_bdev_io_from_ctx((struct nvme_blockio *)ref); struct spdk_bdev_io *bdev_io = spdk_bdev_io_from_ctx((struct nvme_bdev_io *)ref); spdk_bdev_io_complete_nvme_status(bdev_io, cpl->status.sct, cpl->status.sc); } static void queued_reset_sgl(void *ref, uint32_t sgl_offset) bdev_nvme_queued_reset_sgl(void *ref, uint32_t sgl_offset) { struct nvme_blockio *bio = ref; struct nvme_bdev_io *bio = ref; struct iovec *iov; bio->iov_offset = sgl_offset; Loading @@ -782,9 +783,9 @@ queued_reset_sgl(void *ref, uint32_t sgl_offset) } static int queued_next_sge(void *ref, void **address, uint32_t *length) bdev_nvme_queued_next_sge(void *ref, void **address, uint32_t *length) { struct nvme_blockio *bio = ref; struct nvme_bdev_io *bio = ref; struct iovec *iov; assert(bio->iovpos < bio->iovcnt); Loading @@ -809,9 +810,9 @@ queued_next_sge(void *ref, void **address, uint32_t *length) return 0; } int nvme_queue_cmd(struct nvme_blockdev *bdev, struct spdk_nvme_qpair *qpair, struct nvme_blockio *bio, static int bdev_nvme_queue_cmd(struct nvme_bdev *bdev, struct spdk_nvme_qpair *qpair, struct nvme_bdev_io *bio, int direction, struct iovec *iov, int iovcnt, uint64_t nbytes, uint64_t offset) { Loading @@ -835,12 +836,12 @@ nvme_queue_cmd(struct nvme_blockdev *bdev, struct spdk_nvme_qpair *qpair, if (direction == BDEV_DISK_READ) { rc = spdk_nvme_ns_cmd_readv(bdev->ns, qpair, lba, lba_count, queued_done, bio, 0, queued_reset_sgl, queued_next_sge); lba_count, bdev_nvme_queued_done, bio, 0, bdev_nvme_queued_reset_sgl, bdev_nvme_queued_next_sge); } else { rc = spdk_nvme_ns_cmd_writev(bdev->ns, qpair, lba, lba_count, queued_done, bio, 0, queued_reset_sgl, queued_next_sge); lba_count, bdev_nvme_queued_done, bio, 0, bdev_nvme_queued_reset_sgl, bdev_nvme_queued_next_sge); } if (rc != 0) { Loading @@ -850,8 +851,8 @@ nvme_queue_cmd(struct nvme_blockdev *bdev, struct spdk_nvme_qpair *qpair, } static int blockdev_nvme_unmap(struct nvme_blockdev *nbdev, struct spdk_io_channel *ch, struct nvme_blockio *bio, bdev_nvme_unmap(struct nvme_bdev *nbdev, struct spdk_io_channel *ch, struct nvme_bdev_io *bio, struct spdk_scsi_unmap_bdesc *unmap_d, uint16_t bdesc_count) { Loading @@ -873,7 +874,7 @@ blockdev_nvme_unmap(struct nvme_blockdev *nbdev, struct spdk_io_channel *ch, rc = spdk_nvme_ns_cmd_dataset_management(nbdev->ns, nvme_ch->qpair, SPDK_NVME_DSM_ATTR_DEALLOCATE, dsm_range, bdesc_count, queued_done, bio); bdev_nvme_queued_done, bio); if (rc != 0) return -1; Loading @@ -882,7 +883,7 @@ blockdev_nvme_unmap(struct nvme_blockdev *nbdev, struct spdk_io_channel *ch, } static void blockdev_nvme_get_spdk_running_config(FILE *fp) bdev_nvme_get_spdk_running_config(FILE *fp) { fprintf(fp, "\n" Loading Loading
lib/bdev/nvme/blockdev_nvme.c +151 −150 Original line number Diff line number Diff line Loading @@ -53,9 +53,9 @@ #include "spdk_internal/bdev.h" #include "spdk_internal/log.h" static void blockdev_nvme_get_spdk_running_config(FILE *fp); static void bdev_nvme_get_spdk_running_config(FILE *fp); struct nvme_device { struct nvme_ctrlr { /** * points to pinned, physically contiguous memory region; * contains 4KB IDENTIFY structure for controller which is Loading @@ -67,15 +67,14 @@ struct nvme_device { struct spdk_poller *adminq_timer_poller; /** linked list pointer for device list */ TAILQ_ENTRY(nvme_device) tailq; TAILQ_ENTRY(nvme_ctrlr) tailq; int id; }; struct nvme_blockdev { struct nvme_bdev { struct spdk_bdev disk; struct spdk_nvme_ctrlr *ctrlr; struct nvme_device *dev; struct nvme_ctrlr *nvme_ctrlr; struct spdk_nvme_ns *ns; bool allocated; }; Loading @@ -86,7 +85,7 @@ struct nvme_io_channel { }; #define NVME_DEFAULT_MAX_UNMAP_BDESC_COUNT 1 struct nvme_blockio { struct nvme_bdev_io { /** array of iovecs to transfer. */ struct iovec *iovs; Loading @@ -111,36 +110,36 @@ struct nvme_probe_ctx { struct spdk_pci_addr whitelist[NVME_MAX_CONTROLLERS]; }; static struct nvme_blockdev g_blockdev[NVME_MAX_BLOCKDEVS]; 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_device) g_nvme_devices = TAILQ_HEAD_INITIALIZER(g_nvme_devices);; static TAILQ_HEAD(, nvme_ctrlr) g_nvme_ctrlrs = TAILQ_HEAD_INITIALIZER(g_nvme_ctrlrs);; static void nvme_ctrlr_initialize_blockdevs(struct nvme_device *nvme_dev, int ctrlr_id); static int nvme_library_init(void); static void nvme_library_fini(void); static int nvme_queue_cmd(struct nvme_blockdev *bdev, struct spdk_nvme_qpair *qpair, struct nvme_blockio *bio, static void nvme_ctrlr_create_bdevs(struct nvme_ctrlr *nvme_ctrlr, int ctrlr_id); static int bdev_nvme_library_init(void); static void bdev_nvme_library_fini(void); static int bdev_nvme_queue_cmd(struct nvme_bdev *bdev, struct spdk_nvme_qpair *qpair, struct nvme_bdev_io *bio, int direction, struct iovec *iov, int iovcnt, uint64_t nbytes, uint64_t offset); static int nvme_get_ctx_size(void) bdev_nvme_get_ctx_size(void) { return sizeof(struct nvme_blockio); return sizeof(struct nvme_bdev_io); } SPDK_BDEV_MODULE_REGISTER(nvme_library_init, nvme_library_fini, blockdev_nvme_get_spdk_running_config, nvme_get_ctx_size) SPDK_BDEV_MODULE_REGISTER(bdev_nvme_library_init, bdev_nvme_library_fini, bdev_nvme_get_spdk_running_config, bdev_nvme_get_ctx_size) static int64_t blockdev_nvme_readv(struct nvme_blockdev *nbdev, struct spdk_io_channel *ch, struct nvme_blockio *bio, bdev_nvme_readv(struct nvme_bdev *nbdev, struct spdk_io_channel *ch, struct nvme_bdev_io *bio, struct iovec *iov, int iovcnt, uint64_t nbytes, uint64_t offset) { struct nvme_io_channel *nvme_ch = spdk_io_channel_get_ctx(ch); Loading @@ -149,7 +148,7 @@ blockdev_nvme_readv(struct nvme_blockdev *nbdev, struct spdk_io_channel *ch, SPDK_TRACELOG(SPDK_TRACE_BDEV_NVME, "read %lu bytes with offset %#lx\n", nbytes, offset); rc = nvme_queue_cmd(nbdev, nvme_ch->qpair, bio, BDEV_DISK_READ, rc = bdev_nvme_queue_cmd(nbdev, nvme_ch->qpair, bio, BDEV_DISK_READ, iov, iovcnt, nbytes, offset); if (rc < 0) return -1; Loading @@ -158,8 +157,8 @@ blockdev_nvme_readv(struct nvme_blockdev *nbdev, struct spdk_io_channel *ch, } static int64_t blockdev_nvme_writev(struct nvme_blockdev *nbdev, struct spdk_io_channel *ch, struct nvme_blockio *bio, bdev_nvme_writev(struct nvme_bdev *nbdev, struct spdk_io_channel *ch, struct nvme_bdev_io *bio, struct iovec *iov, int iovcnt, size_t len, uint64_t offset) { struct nvme_io_channel *nvme_ch = spdk_io_channel_get_ctx(ch); Loading @@ -168,7 +167,7 @@ blockdev_nvme_writev(struct nvme_blockdev *nbdev, struct spdk_io_channel *ch, SPDK_TRACELOG(SPDK_TRACE_BDEV_NVME, "write %lu bytes with offset %#lx\n", len, offset); rc = nvme_queue_cmd(nbdev, nvme_ch->qpair, bio, BDEV_DISK_WRITE, rc = bdev_nvme_queue_cmd(nbdev, nvme_ch->qpair, bio, BDEV_DISK_WRITE, iov, iovcnt, len, offset); if (rc < 0) return -1; Loading @@ -177,7 +176,7 @@ blockdev_nvme_writev(struct nvme_blockdev *nbdev, struct spdk_io_channel *ch, } static void blockdev_nvme_poll(void *arg) bdev_nvme_poll(void *arg) { struct spdk_nvme_qpair *qpair = arg; Loading @@ -185,7 +184,7 @@ blockdev_nvme_poll(void *arg) } static void blockdev_nvme_poll_adminq(void *arg) bdev_nvme_poll_adminq(void *arg) { struct spdk_nvme_ctrlr *ctrlr = arg; Loading @@ -193,13 +192,13 @@ blockdev_nvme_poll_adminq(void *arg) } static int blockdev_nvme_destruct(struct spdk_bdev *bdev) bdev_nvme_destruct(struct spdk_bdev *bdev) { return 0; } static int blockdev_nvme_flush(struct nvme_blockdev *nbdev, struct nvme_blockio *bio, bdev_nvme_flush(struct nvme_bdev *nbdev, struct nvme_bdev_io *bio, uint64_t offset, uint64_t nbytes) { spdk_bdev_io_complete(spdk_bdev_io_from_ctx(bio), SPDK_BDEV_IO_STATUS_SUCCESS); Loading @@ -208,13 +207,13 @@ blockdev_nvme_flush(struct nvme_blockdev *nbdev, struct nvme_blockio *bio, } static int blockdev_nvme_reset(struct nvme_blockdev *nbdev, struct nvme_blockio *bio) bdev_nvme_reset(struct nvme_bdev *nbdev, struct nvme_bdev_io *bio) { int rc; enum spdk_bdev_io_status status; status = SPDK_BDEV_IO_STATUS_SUCCESS; rc = spdk_nvme_ctrlr_reset(nbdev->ctrlr); rc = spdk_nvme_ctrlr_reset(nbdev->nvme_ctrlr->ctrlr); if (rc != 0) { status = SPDK_BDEV_IO_STATUS_FAILED; } Loading @@ -224,18 +223,19 @@ blockdev_nvme_reset(struct nvme_blockdev *nbdev, struct nvme_blockio *bio) } static int blockdev_nvme_unmap(struct nvme_blockdev *nbdev, struct spdk_io_channel *ch, struct nvme_blockio *bio, bdev_nvme_unmap(struct nvme_bdev *nbdev, struct spdk_io_channel *ch, struct nvme_bdev_io *bio, struct spdk_scsi_unmap_bdesc *umap_d, uint16_t bdesc_count); static void blockdev_nvme_get_rbuf_cb(struct spdk_bdev_io *bdev_io) static void bdev_nvme_get_rbuf_cb(struct spdk_bdev_io *bdev_io) { int ret; ret = blockdev_nvme_readv((struct nvme_blockdev *)bdev_io->ctx, ret = bdev_nvme_readv((struct nvme_bdev *)bdev_io->ctx, bdev_io->ch, (struct nvme_blockio *)bdev_io->driver_ctx, (struct nvme_bdev_io *)bdev_io->driver_ctx, bdev_io->u.read.iovs, bdev_io->u.read.iovcnt, bdev_io->u.read.len, Loading @@ -246,36 +246,37 @@ static void blockdev_nvme_get_rbuf_cb(struct spdk_bdev_io *bdev_io) } } static int _blockdev_nvme_submit_request(struct spdk_bdev_io *bdev_io) static int _bdev_nvme_submit_request(struct spdk_bdev_io *bdev_io) { switch (bdev_io->type) { case SPDK_BDEV_IO_TYPE_READ: spdk_bdev_io_get_rbuf(bdev_io, blockdev_nvme_get_rbuf_cb); spdk_bdev_io_get_rbuf(bdev_io, bdev_nvme_get_rbuf_cb); return 0; case SPDK_BDEV_IO_TYPE_WRITE: return blockdev_nvme_writev((struct nvme_blockdev *)bdev_io->ctx, return bdev_nvme_writev((struct nvme_bdev *)bdev_io->ctx, bdev_io->ch, (struct nvme_blockio *)bdev_io->driver_ctx, (struct nvme_bdev_io *)bdev_io->driver_ctx, bdev_io->u.write.iovs, bdev_io->u.write.iovcnt, bdev_io->u.write.len, bdev_io->u.write.offset); case SPDK_BDEV_IO_TYPE_UNMAP: return blockdev_nvme_unmap((struct nvme_blockdev *)bdev_io->ctx, return bdev_nvme_unmap((struct nvme_bdev *)bdev_io->ctx, bdev_io->ch, (struct nvme_blockio *)bdev_io->driver_ctx, (struct nvme_bdev_io *)bdev_io->driver_ctx, bdev_io->u.unmap.unmap_bdesc, bdev_io->u.unmap.bdesc_count); case SPDK_BDEV_IO_TYPE_RESET: return blockdev_nvme_reset((struct nvme_blockdev *)bdev_io->ctx, (struct nvme_blockio *)bdev_io->driver_ctx); return bdev_nvme_reset((struct nvme_bdev *)bdev_io->ctx, (struct nvme_bdev_io *)bdev_io->driver_ctx); case SPDK_BDEV_IO_TYPE_FLUSH: return blockdev_nvme_flush((struct nvme_blockdev *)bdev_io->ctx, (struct nvme_blockio *)bdev_io->driver_ctx, return bdev_nvme_flush((struct nvme_bdev *)bdev_io->ctx, (struct nvme_bdev_io *)bdev_io->driver_ctx, bdev_io->u.flush.offset, bdev_io->u.flush.length); Loading @@ -285,17 +286,18 @@ static int _blockdev_nvme_submit_request(struct spdk_bdev_io *bdev_io) return 0; } static void blockdev_nvme_submit_request(struct spdk_bdev_io *bdev_io) static void bdev_nvme_submit_request(struct spdk_bdev_io *bdev_io) { if (_blockdev_nvme_submit_request(bdev_io) < 0) { if (_bdev_nvme_submit_request(bdev_io) < 0) { spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_FAILED); } } static bool blockdev_nvme_io_type_supported(struct spdk_bdev *bdev, enum spdk_bdev_io_type io_type) bdev_nvme_io_type_supported(struct spdk_bdev *bdev, enum spdk_bdev_io_type io_type) { struct nvme_blockdev *nbdev = (struct nvme_blockdev *)bdev; struct nvme_bdev *nbdev = (struct nvme_bdev *)bdev; const struct spdk_nvme_ctrlr_data *cdata; switch (io_type) { Loading @@ -306,7 +308,7 @@ blockdev_nvme_io_type_supported(struct spdk_bdev *bdev, enum spdk_bdev_io_type i return true; case SPDK_BDEV_IO_TYPE_UNMAP: cdata = spdk_nvme_ctrlr_get_data(nbdev->ctrlr); cdata = spdk_nvme_ctrlr_get_data(nbdev->nvme_ctrlr->ctrlr); return cdata->oncs.dsm; default: Loading @@ -315,7 +317,7 @@ blockdev_nvme_io_type_supported(struct spdk_bdev *bdev, enum spdk_bdev_io_type i } static int blockdev_nvme_create_cb(void *io_device, uint32_t priority, void *ctx_buf, void *unique_ctx) bdev_nvme_create_cb(void *io_device, uint32_t priority, void *ctx_buf, void *unique_ctx) { struct spdk_nvme_ctrlr *ctrlr = io_device; struct nvme_io_channel *ch = ctx_buf; Loading @@ -326,13 +328,13 @@ blockdev_nvme_create_cb(void *io_device, uint32_t priority, void *ctx_buf, void return -1; } spdk_poller_register(&ch->poller, blockdev_nvme_poll, ch->qpair, spdk_poller_register(&ch->poller, bdev_nvme_poll, ch->qpair, spdk_app_get_current_core(), 0); return 0; } static void blockdev_nvme_destroy_cb(void *io_device, void *ctx_buf) bdev_nvme_destroy_cb(void *io_device, void *ctx_buf) { struct nvme_io_channel *ch = ctx_buf; Loading @@ -341,36 +343,36 @@ blockdev_nvme_destroy_cb(void *io_device, void *ctx_buf) } static struct spdk_io_channel * blockdev_nvme_get_io_channel(struct spdk_bdev *bdev, uint32_t priority) bdev_nvme_get_io_channel(struct spdk_bdev *bdev, uint32_t priority) { struct nvme_blockdev *nvme_bdev = (struct nvme_blockdev *)bdev; struct nvme_bdev *nvme_bdev = (struct nvme_bdev *)bdev; return spdk_get_io_channel(nvme_bdev->ctrlr, priority, false, NULL); return spdk_get_io_channel(nvme_bdev->nvme_ctrlr->ctrlr, priority, false, NULL); } static int blockdev_nvme_dump_config_json(struct spdk_bdev *bdev, struct spdk_json_write_ctx *w) bdev_nvme_dump_config_json(struct spdk_bdev *bdev, struct spdk_json_write_ctx *w) { struct nvme_blockdev *nvme_bdev = (struct nvme_blockdev *)bdev; struct nvme_device *nvme_dev = nvme_bdev->dev; struct nvme_bdev *nvme_bdev = (struct nvme_bdev *)bdev; struct nvme_ctrlr *nvme_ctrlr = nvme_bdev->nvme_ctrlr; const struct spdk_nvme_ctrlr_data *cdata; struct spdk_nvme_ns *ns; union spdk_nvme_vs_register vs; union spdk_nvme_csts_register csts; char buf[128]; cdata = spdk_nvme_ctrlr_get_data(nvme_bdev->ctrlr); vs = spdk_nvme_ctrlr_get_regs_vs(nvme_bdev->ctrlr); csts = spdk_nvme_ctrlr_get_regs_csts(nvme_bdev->ctrlr); cdata = spdk_nvme_ctrlr_get_data(nvme_bdev->nvme_ctrlr->ctrlr); vs = spdk_nvme_ctrlr_get_regs_vs(nvme_bdev->nvme_ctrlr->ctrlr); csts = spdk_nvme_ctrlr_get_regs_csts(nvme_bdev->nvme_ctrlr->ctrlr); ns = nvme_bdev->ns; spdk_json_write_name(w, "nvme"); spdk_json_write_object_begin(w); spdk_json_write_name(w, "pci_address"); spdk_json_write_string_fmt(w, "%04x:%02x:%02x.%x", nvme_dev->pci_addr.domain, nvme_dev->pci_addr.bus, nvme_dev->pci_addr.dev, nvme_dev->pci_addr.func); spdk_json_write_string_fmt(w, "%04x:%02x:%02x.%x", nvme_ctrlr->pci_addr.domain, nvme_ctrlr->pci_addr.bus, nvme_ctrlr->pci_addr.dev, nvme_ctrlr->pci_addr.func); spdk_json_write_name(w, "ctrlr_data"); spdk_json_write_object_begin(w); Loading Loading @@ -449,11 +451,11 @@ blockdev_nvme_dump_config_json(struct spdk_bdev *bdev, struct spdk_json_write_ct } static const struct spdk_bdev_fn_table nvmelib_fn_table = { .destruct = blockdev_nvme_destruct, .submit_request = blockdev_nvme_submit_request, .io_type_supported = blockdev_nvme_io_type_supported, .get_io_channel = blockdev_nvme_get_io_channel, .dump_config_json = blockdev_nvme_dump_config_json, .destruct = bdev_nvme_destruct, .submit_request = bdev_nvme_submit_request, .io_type_supported = bdev_nvme_io_type_supported, .get_io_channel = bdev_nvme_get_io_channel, .dump_config_json = bdev_nvme_dump_config_json, }; static bool Loading Loading @@ -502,7 +504,7 @@ probe_cb(void *cb_ctx, const struct spdk_nvme_transport_id *trid, } static void blockdev_nvme_timeout_cb(void *cb_arg, struct spdk_nvme_ctrlr *ctrlr, timeout_cb(void *cb_arg, struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qpair *qpair, uint16_t cid) { int rc; Loading @@ -519,9 +521,9 @@ static void attach_cb(void *cb_ctx, const struct spdk_nvme_transport_id *trid, struct spdk_nvme_ctrlr *ctrlr, const struct spdk_nvme_ctrlr_opts *opts) { struct nvme_device *dev; struct nvme_ctrlr *dev; dev = malloc(sizeof(struct nvme_device)); dev = malloc(sizeof(struct nvme_ctrlr)); if (dev == NULL) { SPDK_ERRLOG("Failed to allocate device struct\n"); return; Loading @@ -532,28 +534,28 @@ attach_cb(void *cb_ctx, const struct spdk_nvme_transport_id *trid, spdk_pci_addr_parse(&dev->pci_addr, trid->traddr); dev->id = nvme_controller_index++; nvme_ctrlr_initialize_blockdevs(dev, dev->id); nvme_ctrlr_create_bdevs(dev, dev->id); spdk_poller_register(&dev->adminq_timer_poller, blockdev_nvme_poll_adminq, ctrlr, spdk_poller_register(&dev->adminq_timer_poller, bdev_nvme_poll_adminq, ctrlr, spdk_app_get_current_core(), g_nvme_adminq_poll_timeout_us); spdk_io_device_register(ctrlr, blockdev_nvme_create_cb, blockdev_nvme_destroy_cb, spdk_io_device_register(ctrlr, bdev_nvme_create_cb, bdev_nvme_destroy_cb, sizeof(struct nvme_io_channel)); TAILQ_INSERT_TAIL(&g_nvme_devices, dev, tailq); TAILQ_INSERT_TAIL(&g_nvme_ctrlrs, dev, tailq); if (g_reset_controller_on_timeout) { spdk_nvme_ctrlr_register_timeout_callback(ctrlr, g_timeout, blockdev_nvme_timeout_cb, NULL); timeout_cb, NULL); } } static bool spdk_bdev_nvme_exists(struct spdk_pci_addr *addr) nvme_ctrlr_exists(struct spdk_pci_addr *addr) { struct nvme_device *nvme_dev; struct nvme_ctrlr *nvme_ctrlr; TAILQ_FOREACH(nvme_dev, &g_nvme_devices, tailq) { if (spdk_pci_addr_compare(&nvme_dev->pci_addr, addr) == 0) { TAILQ_FOREACH(nvme_ctrlr, &g_nvme_ctrlrs, tailq) { if (spdk_pci_addr_compare(&nvme_ctrlr->pci_addr, addr) == 0) { return true; } } Loading @@ -575,7 +577,7 @@ spdk_bdev_nvme_create(struct spdk_nvme_transport_id *trid, probe_ctx.num_whitelist_controllers = 1; probe_ctx.controllers_remaining = 1; if (spdk_bdev_nvme_exists(&probe_ctx.whitelist[0])) { if (nvme_ctrlr_exists(&probe_ctx.whitelist[0])) { return -1; } Loading @@ -588,9 +590,9 @@ spdk_bdev_nvme_create(struct spdk_nvme_transport_id *trid, * 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_blockdev[i].allocated) { if (spdk_pci_addr_compare(&probe_ctx.whitelist[0], &g_blockdev[i].dev->pci_addr) == 0) { names[j] = g_blockdev[i].disk.name; if (g_bdev[i].allocated) { if (spdk_pci_addr_compare(&probe_ctx.whitelist[0], &g_bdev[i].nvme_ctrlr->pci_addr) == 0) { names[j] = g_bdev[i].disk.name; j++; } } Loading @@ -601,7 +603,7 @@ spdk_bdev_nvme_create(struct spdk_nvme_transport_id *trid, } static int nvme_library_init(void) bdev_nvme_library_init(void) { struct spdk_conf_section *sp; const char *val; Loading Loading @@ -673,38 +675,38 @@ nvme_library_init(void) } static void nvme_library_fini(void) bdev_nvme_library_fini(void) { struct nvme_device *dev; struct nvme_ctrlr *dev; while (!TAILQ_EMPTY(&g_nvme_devices)) { dev = TAILQ_FIRST(&g_nvme_devices); TAILQ_REMOVE(&g_nvme_devices, dev, tailq); 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); } } static struct nvme_blockdev * allocate_nvme_blockdev(void) static struct nvme_bdev * nvme_bdev_alloc(void) { int i; for (i = 0; i < NVME_MAX_BLOCKDEVS; i++) { if (g_blockdev[i].allocated == false) { g_blockdev[i].allocated = true; return &g_blockdev[i]; if (g_bdev[i].allocated == false) { g_bdev[i].allocated = true; return &g_bdev[i]; } } return NULL; } static void nvme_ctrlr_initialize_blockdevs(struct nvme_device *nvme_dev, int ctrlr_id) nvme_ctrlr_create_bdevs(struct nvme_ctrlr *nvme_ctrlr, int ctrlr_id) { struct nvme_blockdev *bdev; struct spdk_nvme_ctrlr *ctrlr = nvme_dev->ctrlr; struct nvme_bdev *bdev; struct spdk_nvme_ctrlr *ctrlr = nvme_ctrlr->ctrlr; struct spdk_nvme_ns *ns; const struct spdk_nvme_ctrlr_data *cdata; int ns_id, num_ns; Loading @@ -720,13 +722,12 @@ nvme_ctrlr_initialize_blockdevs(struct nvme_device *nvme_dev, int ctrlr_id) continue; } bdev = allocate_nvme_blockdev(); bdev = nvme_bdev_alloc(); if (bdev == NULL) { return; } bdev->ctrlr = ctrlr; bdev->dev = nvme_dev; bdev->nvme_ctrlr = nvme_ctrlr; bdev->ns = ns; snprintf(bdev->disk.name, SPDK_BDEV_MAX_NAME_LENGTH, Loading Loading @@ -758,17 +759,17 @@ nvme_ctrlr_initialize_blockdevs(struct nvme_device *nvme_dev, int ctrlr_id) } static void queued_done(void *ref, const struct spdk_nvme_cpl *cpl) bdev_nvme_queued_done(void *ref, const struct spdk_nvme_cpl *cpl) { struct spdk_bdev_io *bdev_io = spdk_bdev_io_from_ctx((struct nvme_blockio *)ref); struct spdk_bdev_io *bdev_io = spdk_bdev_io_from_ctx((struct nvme_bdev_io *)ref); spdk_bdev_io_complete_nvme_status(bdev_io, cpl->status.sct, cpl->status.sc); } static void queued_reset_sgl(void *ref, uint32_t sgl_offset) bdev_nvme_queued_reset_sgl(void *ref, uint32_t sgl_offset) { struct nvme_blockio *bio = ref; struct nvme_bdev_io *bio = ref; struct iovec *iov; bio->iov_offset = sgl_offset; Loading @@ -782,9 +783,9 @@ queued_reset_sgl(void *ref, uint32_t sgl_offset) } static int queued_next_sge(void *ref, void **address, uint32_t *length) bdev_nvme_queued_next_sge(void *ref, void **address, uint32_t *length) { struct nvme_blockio *bio = ref; struct nvme_bdev_io *bio = ref; struct iovec *iov; assert(bio->iovpos < bio->iovcnt); Loading @@ -809,9 +810,9 @@ queued_next_sge(void *ref, void **address, uint32_t *length) return 0; } int nvme_queue_cmd(struct nvme_blockdev *bdev, struct spdk_nvme_qpair *qpair, struct nvme_blockio *bio, static int bdev_nvme_queue_cmd(struct nvme_bdev *bdev, struct spdk_nvme_qpair *qpair, struct nvme_bdev_io *bio, int direction, struct iovec *iov, int iovcnt, uint64_t nbytes, uint64_t offset) { Loading @@ -835,12 +836,12 @@ nvme_queue_cmd(struct nvme_blockdev *bdev, struct spdk_nvme_qpair *qpair, if (direction == BDEV_DISK_READ) { rc = spdk_nvme_ns_cmd_readv(bdev->ns, qpair, lba, lba_count, queued_done, bio, 0, queued_reset_sgl, queued_next_sge); lba_count, bdev_nvme_queued_done, bio, 0, bdev_nvme_queued_reset_sgl, bdev_nvme_queued_next_sge); } else { rc = spdk_nvme_ns_cmd_writev(bdev->ns, qpair, lba, lba_count, queued_done, bio, 0, queued_reset_sgl, queued_next_sge); lba_count, bdev_nvme_queued_done, bio, 0, bdev_nvme_queued_reset_sgl, bdev_nvme_queued_next_sge); } if (rc != 0) { Loading @@ -850,8 +851,8 @@ nvme_queue_cmd(struct nvme_blockdev *bdev, struct spdk_nvme_qpair *qpair, } static int blockdev_nvme_unmap(struct nvme_blockdev *nbdev, struct spdk_io_channel *ch, struct nvme_blockio *bio, bdev_nvme_unmap(struct nvme_bdev *nbdev, struct spdk_io_channel *ch, struct nvme_bdev_io *bio, struct spdk_scsi_unmap_bdesc *unmap_d, uint16_t bdesc_count) { Loading @@ -873,7 +874,7 @@ blockdev_nvme_unmap(struct nvme_blockdev *nbdev, struct spdk_io_channel *ch, rc = spdk_nvme_ns_cmd_dataset_management(nbdev->ns, nvme_ch->qpair, SPDK_NVME_DSM_ATTR_DEALLOCATE, dsm_range, bdesc_count, queued_done, bio); bdev_nvme_queued_done, bio); if (rc != 0) return -1; Loading @@ -882,7 +883,7 @@ blockdev_nvme_unmap(struct nvme_blockdev *nbdev, struct spdk_io_channel *ch, } static void blockdev_nvme_get_spdk_running_config(FILE *fp) bdev_nvme_get_spdk_running_config(FILE *fp) { fprintf(fp, "\n" Loading