diff --git a/include/spdk/nvme.h b/include/spdk/nvme.h index c46240910..345c28416 100644 --- a/include/spdk/nvme.h +++ b/include/spdk/nvme.h @@ -2842,6 +2842,8 @@ void spdk_nvme_cuse_unregister(struct spdk_nvme_ctrlr *ctrlr); struct nvme_request; +struct spdk_nvme_transport; + struct spdk_nvme_transport_ops { char name[SPDK_NVMF_TRSTRING_MAX_LEN + 1]; diff --git a/lib/nvme/nvme_internal.h b/lib/nvme/nvme_internal.h index 1c5a0877c..8d5619bc7 100644 --- a/lib/nvme/nvme_internal.h +++ b/lib/nvme/nvme_internal.h @@ -358,59 +358,54 @@ enum nvme_qpair_state { NVME_QPAIR_ENABLED, }; -struct nvme_transport { - struct spdk_nvme_transport_ops ops; - TAILQ_ENTRY(nvme_transport) link; -}; - struct spdk_nvme_qpair { - struct spdk_nvme_ctrlr *ctrlr; + struct spdk_nvme_ctrlr *ctrlr; - uint16_t id; + uint16_t id; - uint8_t qprio; + uint8_t qprio; - uint8_t state : 3; + uint8_t state : 3; /* * Members for handling IO qpair deletion inside of a completion context. * These are specifically defined as single bits, so that they do not * push this data structure out to another cacheline. */ - uint8_t in_completion_context : 1; - uint8_t delete_after_completion_context: 1; + uint8_t in_completion_context : 1; + uint8_t delete_after_completion_context: 1; /* * Set when no deletion notification is needed. For example, the process * which allocated this qpair exited unexpectedly. */ - uint8_t no_deletion_notification_needed: 1; + uint8_t no_deletion_notification_needed: 1; - uint8_t first_fused_submitted: 1; + uint8_t first_fused_submitted: 1; - enum spdk_nvme_transport_type trtype; + enum spdk_nvme_transport_type trtype; - STAILQ_HEAD(, nvme_request) free_req; - STAILQ_HEAD(, nvme_request) queued_req; + STAILQ_HEAD(, nvme_request) free_req; + STAILQ_HEAD(, nvme_request) queued_req; /** Commands opcode in this list will return error */ - TAILQ_HEAD(, nvme_error_cmd) err_cmd_head; + TAILQ_HEAD(, nvme_error_cmd) err_cmd_head; /** Requests in this list will return error */ - STAILQ_HEAD(, nvme_request) err_req_head; + STAILQ_HEAD(, nvme_request) err_req_head; /* List entry for spdk_nvme_ctrlr::active_io_qpairs */ - TAILQ_ENTRY(spdk_nvme_qpair) tailq; + TAILQ_ENTRY(spdk_nvme_qpair) tailq; /* List entry for spdk_nvme_ctrlr_process::allocated_io_qpairs */ - TAILQ_ENTRY(spdk_nvme_qpair) per_process_tailq; + TAILQ_ENTRY(spdk_nvme_qpair) per_process_tailq; - struct spdk_nvme_ctrlr_process *active_proc; + struct spdk_nvme_ctrlr_process *active_proc; - void *req_buf; + void *req_buf; - const struct nvme_transport *transport; + const struct spdk_nvme_transport *transport; - uint8_t transport_failure_reason: 2; + uint8_t transport_failure_reason: 2; }; struct spdk_nvme_ns { @@ -1125,7 +1120,7 @@ bool nvme_completion_is_retry(const struct spdk_nvme_cpl *cpl); struct spdk_nvme_ctrlr *spdk_nvme_get_ctrlr_by_trid_unsafe( const struct spdk_nvme_transport_id *trid); -const struct nvme_transport *nvme_get_transport(const char *transport_name); +const struct spdk_nvme_transport *nvme_get_transport(const char *transport_name); /* Transport specific functions */ struct spdk_nvme_ctrlr *nvme_transport_ctrlr_construct(const struct spdk_nvme_transport_id *trid, diff --git a/lib/nvme/nvme_transport.c b/lib/nvme/nvme_transport.c index 006c982e5..3598349e7 100644 --- a/lib/nvme/nvme_transport.c +++ b/lib/nvme/nvme_transport.c @@ -38,7 +38,12 @@ #include "nvme_internal.h" #include "spdk/queue.h" -TAILQ_HEAD(nvme_transport_list, nvme_transport) g_spdk_nvme_transports = +struct spdk_nvme_transport { + struct spdk_nvme_transport_ops ops; + TAILQ_ENTRY(spdk_nvme_transport) link; +}; + +TAILQ_HEAD(nvme_transport_list, spdk_nvme_transport) g_spdk_nvme_transports = TAILQ_HEAD_INITIALIZER(g_spdk_nvme_transports); /* @@ -49,10 +54,10 @@ TAILQ_HEAD(nvme_transport_list, nvme_transport) g_spdk_nvme_transports = * In the I/O path, we have the ability to store the transport struct in the I/O * qpairs to avoid taking a performance hit. */ -const struct nvme_transport * +const struct spdk_nvme_transport * nvme_get_transport(const char *transport_name) { - struct nvme_transport *registered_transport; + struct spdk_nvme_transport *registered_transport; TAILQ_FOREACH(registered_transport, &g_spdk_nvme_transports, link) { if (strcasecmp(transport_name, registered_transport->ops.name) == 0) { @@ -77,7 +82,7 @@ spdk_nvme_transport_available_by_name(const char *transport_name) void spdk_nvme_transport_register(const struct spdk_nvme_transport_ops *ops) { - struct nvme_transport *new_transport; + struct spdk_nvme_transport *new_transport; if (nvme_get_transport(ops->name)) { SPDK_ERRLOG("Double registering NVMe transport %s is prohibited.\n", ops->name); @@ -99,7 +104,7 @@ struct spdk_nvme_ctrlr *nvme_transport_ctrlr_construct(const struct spdk_nvme_tr const struct spdk_nvme_ctrlr_opts *opts, void *devhandle) { - const struct nvme_transport *transport = nvme_get_transport(trid->trstring); + const struct spdk_nvme_transport *transport = nvme_get_transport(trid->trstring); struct spdk_nvme_ctrlr *ctrlr; if (transport == NULL) { @@ -116,7 +121,7 @@ int nvme_transport_ctrlr_scan(struct spdk_nvme_probe_ctx *probe_ctx, bool direct_connect) { - const struct nvme_transport *transport = nvme_get_transport(probe_ctx->trid.trstring); + const struct spdk_nvme_transport *transport = nvme_get_transport(probe_ctx->trid.trstring); if (transport == NULL) { SPDK_ERRLOG("Transport %s doesn't exist.", probe_ctx->trid.trstring); @@ -129,7 +134,7 @@ nvme_transport_ctrlr_scan(struct spdk_nvme_probe_ctx *probe_ctx, int nvme_transport_ctrlr_destruct(struct spdk_nvme_ctrlr *ctrlr) { - const struct nvme_transport *transport = nvme_get_transport(ctrlr->trid.trstring); + const struct spdk_nvme_transport *transport = nvme_get_transport(ctrlr->trid.trstring); assert(transport != NULL); return transport->ops.ctrlr_destruct(ctrlr); @@ -138,7 +143,7 @@ nvme_transport_ctrlr_destruct(struct spdk_nvme_ctrlr *ctrlr) int nvme_transport_ctrlr_enable(struct spdk_nvme_ctrlr *ctrlr) { - const struct nvme_transport *transport = nvme_get_transport(ctrlr->trid.trstring); + const struct spdk_nvme_transport *transport = nvme_get_transport(ctrlr->trid.trstring); assert(transport != NULL); return transport->ops.ctrlr_enable(ctrlr); @@ -147,7 +152,7 @@ nvme_transport_ctrlr_enable(struct spdk_nvme_ctrlr *ctrlr) int nvme_transport_ctrlr_set_reg_4(struct spdk_nvme_ctrlr *ctrlr, uint32_t offset, uint32_t value) { - const struct nvme_transport *transport = nvme_get_transport(ctrlr->trid.trstring); + const struct spdk_nvme_transport *transport = nvme_get_transport(ctrlr->trid.trstring); assert(transport != NULL); return transport->ops.ctrlr_set_reg_4(ctrlr, offset, value); @@ -156,7 +161,7 @@ nvme_transport_ctrlr_set_reg_4(struct spdk_nvme_ctrlr *ctrlr, uint32_t offset, u int nvme_transport_ctrlr_set_reg_8(struct spdk_nvme_ctrlr *ctrlr, uint32_t offset, uint64_t value) { - const struct nvme_transport *transport = nvme_get_transport(ctrlr->trid.trstring); + const struct spdk_nvme_transport *transport = nvme_get_transport(ctrlr->trid.trstring); assert(transport != NULL); return transport->ops.ctrlr_set_reg_8(ctrlr, offset, value); @@ -165,7 +170,7 @@ nvme_transport_ctrlr_set_reg_8(struct spdk_nvme_ctrlr *ctrlr, uint32_t offset, u int nvme_transport_ctrlr_get_reg_4(struct spdk_nvme_ctrlr *ctrlr, uint32_t offset, uint32_t *value) { - const struct nvme_transport *transport = nvme_get_transport(ctrlr->trid.trstring); + const struct spdk_nvme_transport *transport = nvme_get_transport(ctrlr->trid.trstring); assert(transport != NULL); return transport->ops.ctrlr_get_reg_4(ctrlr, offset, value); @@ -174,7 +179,7 @@ nvme_transport_ctrlr_get_reg_4(struct spdk_nvme_ctrlr *ctrlr, uint32_t offset, u int nvme_transport_ctrlr_get_reg_8(struct spdk_nvme_ctrlr *ctrlr, uint32_t offset, uint64_t *value) { - const struct nvme_transport *transport = nvme_get_transport(ctrlr->trid.trstring); + const struct spdk_nvme_transport *transport = nvme_get_transport(ctrlr->trid.trstring); assert(transport != NULL); return transport->ops.ctrlr_get_reg_8(ctrlr, offset, value); @@ -183,7 +188,7 @@ nvme_transport_ctrlr_get_reg_8(struct spdk_nvme_ctrlr *ctrlr, uint32_t offset, u uint32_t nvme_transport_ctrlr_get_max_xfer_size(struct spdk_nvme_ctrlr *ctrlr) { - const struct nvme_transport *transport = nvme_get_transport(ctrlr->trid.trstring); + const struct spdk_nvme_transport *transport = nvme_get_transport(ctrlr->trid.trstring); assert(transport != NULL); return transport->ops.ctrlr_get_max_xfer_size(ctrlr); @@ -192,7 +197,7 @@ nvme_transport_ctrlr_get_max_xfer_size(struct spdk_nvme_ctrlr *ctrlr) uint16_t nvme_transport_ctrlr_get_max_sges(struct spdk_nvme_ctrlr *ctrlr) { - const struct nvme_transport *transport = nvme_get_transport(ctrlr->trid.trstring); + const struct spdk_nvme_transport *transport = nvme_get_transport(ctrlr->trid.trstring); assert(transport != NULL); return transport->ops.ctrlr_get_max_sges(ctrlr); @@ -201,7 +206,7 @@ nvme_transport_ctrlr_get_max_sges(struct spdk_nvme_ctrlr *ctrlr) void * nvme_transport_ctrlr_alloc_cmb_io_buffer(struct spdk_nvme_ctrlr *ctrlr, size_t size) { - const struct nvme_transport *transport = nvme_get_transport(ctrlr->trid.trstring); + const struct spdk_nvme_transport *transport = nvme_get_transport(ctrlr->trid.trstring); assert(transport != NULL); if (transport->ops.ctrlr_alloc_cmb_io_buffer != NULL) { @@ -214,7 +219,7 @@ nvme_transport_ctrlr_alloc_cmb_io_buffer(struct spdk_nvme_ctrlr *ctrlr, size_t s int nvme_transport_ctrlr_free_cmb_io_buffer(struct spdk_nvme_ctrlr *ctrlr, void *buf, size_t size) { - const struct nvme_transport *transport = nvme_get_transport(ctrlr->trid.trstring); + const struct spdk_nvme_transport *transport = nvme_get_transport(ctrlr->trid.trstring); assert(transport != NULL); if (transport->ops.ctrlr_free_cmb_io_buffer != NULL) { @@ -229,7 +234,7 @@ nvme_transport_ctrlr_create_io_qpair(struct spdk_nvme_ctrlr *ctrlr, uint16_t qid const struct spdk_nvme_io_qpair_opts *opts) { struct spdk_nvme_qpair *qpair; - const struct nvme_transport *transport = nvme_get_transport(ctrlr->trid.trstring); + const struct spdk_nvme_transport *transport = nvme_get_transport(ctrlr->trid.trstring); assert(transport != NULL); qpair = transport->ops.ctrlr_create_io_qpair(ctrlr, qid, opts); @@ -249,7 +254,7 @@ nvme_transport_ctrlr_delete_io_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_ int nvme_transport_ctrlr_connect_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qpair *qpair) { - const struct nvme_transport *transport = nvme_get_transport(ctrlr->trid.trstring); + const struct spdk_nvme_transport *transport = nvme_get_transport(ctrlr->trid.trstring); assert(transport != NULL); if (!nvme_qpair_is_admin_queue(qpair)) { @@ -262,7 +267,7 @@ nvme_transport_ctrlr_connect_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nv void nvme_transport_ctrlr_disconnect_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qpair *qpair) { - const struct nvme_transport *transport = nvme_get_transport(ctrlr->trid.trstring); + const struct spdk_nvme_transport *transport = nvme_get_transport(ctrlr->trid.trstring); assert(transport != NULL); transport->ops.ctrlr_disconnect_qpair(ctrlr, qpair); @@ -271,7 +276,7 @@ nvme_transport_ctrlr_disconnect_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk void nvme_transport_qpair_abort_reqs(struct spdk_nvme_qpair *qpair, uint32_t dnr) { - const struct nvme_transport *transport; + const struct spdk_nvme_transport *transport; assert(dnr <= 1); if (spdk_likely(!nvme_qpair_is_admin_queue(qpair))) { @@ -286,7 +291,7 @@ nvme_transport_qpair_abort_reqs(struct spdk_nvme_qpair *qpair, uint32_t dnr) int nvme_transport_qpair_reset(struct spdk_nvme_qpair *qpair) { - const struct nvme_transport *transport; + const struct spdk_nvme_transport *transport; if (spdk_likely(!nvme_qpair_is_admin_queue(qpair))) { return qpair->transport->ops.qpair_reset(qpair); @@ -300,7 +305,7 @@ nvme_transport_qpair_reset(struct spdk_nvme_qpair *qpair) int nvme_transport_qpair_submit_request(struct spdk_nvme_qpair *qpair, struct nvme_request *req) { - const struct nvme_transport *transport; + const struct spdk_nvme_transport *transport; if (spdk_likely(!nvme_qpair_is_admin_queue(qpair))) { return qpair->transport->ops.qpair_submit_request(qpair, req); @@ -314,7 +319,7 @@ nvme_transport_qpair_submit_request(struct spdk_nvme_qpair *qpair, struct nvme_r int32_t nvme_transport_qpair_process_completions(struct spdk_nvme_qpair *qpair, uint32_t max_completions) { - const struct nvme_transport *transport; + const struct spdk_nvme_transport *transport; if (spdk_likely(!nvme_qpair_is_admin_queue(qpair))) { return qpair->transport->ops.qpair_process_completions(qpair, max_completions); @@ -328,7 +333,7 @@ nvme_transport_qpair_process_completions(struct spdk_nvme_qpair *qpair, uint32_t void nvme_transport_admin_qpair_abort_aers(struct spdk_nvme_qpair *qpair) { - const struct nvme_transport *transport = nvme_get_transport(qpair->ctrlr->trid.trstring); + const struct spdk_nvme_transport *transport = nvme_get_transport(qpair->ctrlr->trid.trstring); assert(transport != NULL); transport->ops.admin_qpair_abort_aers(qpair); diff --git a/test/common/lib/nvme/common_stubs.h b/test/common/lib/nvme/common_stubs.h index 38f310fcd..cca1a2046 100644 --- a/test/common/lib/nvme/common_stubs.h +++ b/test/common/lib/nvme/common_stubs.h @@ -93,7 +93,8 @@ DEFINE_STUB(spdk_nvme_ctrlr_get_current_process, struct spdk_nvme_ctrlr_process DEFINE_STUB(nvme_ctrlr_add_process, int, (struct spdk_nvme_ctrlr *ctrlr, void *devhandle), 0); DEFINE_STUB_V(spdk_nvme_trid_populate_transport, (struct spdk_nvme_transport_id *trid, enum spdk_nvme_transport_type trtype)); -DEFINE_STUB(nvme_get_transport, const struct nvme_transport *, (const char *transport_name), NULL); +DEFINE_STUB(nvme_get_transport, const struct spdk_nvme_transport *, (const char *transport_name), + NULL); /* Fabric transports only */ DEFINE_STUB_V(nvme_ctrlr_disconnect_qpair, (struct spdk_nvme_qpair *qpair));