From e4eef6975c951f615f64f1fd175330d4552257ad Mon Sep 17 00:00:00 2001 From: Seth Howell Date: Thu, 26 Dec 2019 10:10:02 -0700 Subject: [PATCH] lib/nvme: add function tables for all transports. Signed-off-by: Seth Howell Change-Id: I4e7af1c42a19346f4abcb17910a41f8104a2de1b Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/478871 Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Shuhei Matsumoto --- lib/nvme/nvme_pcie.c | 33 +++++++++++++++ lib/nvme/nvme_rdma.c | 33 +++++++++++++++ lib/nvme/nvme_tcp.c | 33 +++++++++++++++ test/common/lib/nvme/common_stubs.h | 41 +++++++++++++++++++ test/unit/lib/nvme/nvme_pcie.c/nvme_pcie_ut.c | 39 +++++++++++++++--- test/unit/lib/nvme/nvme_rdma.c/nvme_rdma_ut.c | 8 +++- test/unit/lib/nvme/nvme_tcp.c/nvme_tcp_ut.c | 8 ---- 7 files changed, 181 insertions(+), 14 deletions(-) diff --git a/lib/nvme/nvme_pcie.c b/lib/nvme/nvme_pcie.c index 200749fe9..b787ed37f 100644 --- a/lib/nvme/nvme_pcie.c +++ b/lib/nvme/nvme_pcie.c @@ -2273,3 +2273,36 @@ nvme_pcie_qpair_process_completions(struct spdk_nvme_qpair *qpair, uint32_t max_ return num_completions; } + +const struct spdk_nvme_transport_ops pcie_ops = { + .name = "PCIE", + .type = SPDK_NVME_TRANSPORT_PCIE, + .ctrlr_construct = nvme_pcie_ctrlr_construct, + .ctrlr_scan = nvme_pcie_ctrlr_scan, + .ctrlr_destruct = nvme_pcie_ctrlr_destruct, + .ctrlr_enable = nvme_pcie_ctrlr_enable, + + .ctrlr_set_reg_4 = nvme_pcie_ctrlr_set_reg_4, + .ctrlr_set_reg_8 = nvme_pcie_ctrlr_set_reg_8, + .ctrlr_get_reg_4 = nvme_pcie_ctrlr_get_reg_4, + .ctrlr_get_reg_8 = nvme_pcie_ctrlr_get_reg_8, + + .ctrlr_get_max_xfer_size = nvme_pcie_ctrlr_get_max_xfer_size, + .ctrlr_get_max_sges = nvme_pcie_ctrlr_get_max_sges, + + .ctrlr_alloc_cmb_io_buffer = nvme_pcie_ctrlr_alloc_cmb_io_buffer, + .ctrlr_free_cmb_io_buffer = nvme_pcie_ctrlr_free_cmb_io_buffer, + + .ctrlr_create_io_qpair = nvme_pcie_ctrlr_create_io_qpair, + .ctrlr_delete_io_qpair = nvme_pcie_ctrlr_delete_io_qpair, + .ctrlr_connect_qpair = nvme_pcie_ctrlr_connect_qpair, + .ctrlr_disconnect_qpair = nvme_pcie_ctrlr_disconnect_qpair, + + .qpair_abort_reqs = nvme_pcie_qpair_abort_reqs, + .qpair_reset = nvme_pcie_qpair_reset, + .qpair_submit_request = nvme_pcie_qpair_submit_request, + .qpair_process_completions = nvme_pcie_qpair_process_completions, + .admin_qpair_abort_aers = nvme_pcie_admin_qpair_abort_aers, +}; + +SPDK_NVME_TRANSPORT_REGISTER(pcie, &pcie_ops); diff --git a/lib/nvme/nvme_rdma.c b/lib/nvme/nvme_rdma.c index c0a65e5fc..839b91d16 100644 --- a/lib/nvme/nvme_rdma.c +++ b/lib/nvme/nvme_rdma.c @@ -2161,3 +2161,36 @@ spdk_nvme_rdma_init_hooks(struct spdk_nvme_rdma_hooks *hooks) { g_nvme_hooks = *hooks; } + +const struct spdk_nvme_transport_ops rdma_ops = { + .name = "RDMA", + .type = SPDK_NVME_TRANSPORT_RDMA, + .ctrlr_construct = nvme_rdma_ctrlr_construct, + .ctrlr_scan = nvme_fabric_ctrlr_scan, + .ctrlr_destruct = nvme_rdma_ctrlr_destruct, + .ctrlr_enable = nvme_rdma_ctrlr_enable, + + .ctrlr_set_reg_4 = nvme_fabric_ctrlr_set_reg_4, + .ctrlr_set_reg_8 = nvme_fabric_ctrlr_set_reg_8, + .ctrlr_get_reg_4 = nvme_fabric_ctrlr_get_reg_4, + .ctrlr_get_reg_8 = nvme_fabric_ctrlr_get_reg_8, + + .ctrlr_get_max_xfer_size = nvme_rdma_ctrlr_get_max_xfer_size, + .ctrlr_get_max_sges = nvme_rdma_ctrlr_get_max_sges, + + .ctrlr_alloc_cmb_io_buffer = nvme_rdma_ctrlr_alloc_cmb_io_buffer, + .ctrlr_free_cmb_io_buffer = nvme_rdma_ctrlr_free_cmb_io_buffer, + + .ctrlr_create_io_qpair = nvme_rdma_ctrlr_create_io_qpair, + .ctrlr_delete_io_qpair = nvme_rdma_ctrlr_delete_io_qpair, + .ctrlr_connect_qpair = nvme_rdma_ctrlr_connect_qpair, + .ctrlr_disconnect_qpair = nvme_rdma_ctrlr_disconnect_qpair, + + .qpair_abort_reqs = nvme_rdma_qpair_abort_reqs, + .qpair_reset = nvme_rdma_qpair_reset, + .qpair_submit_request = nvme_rdma_qpair_submit_request, + .qpair_process_completions = nvme_rdma_qpair_process_completions, + .admin_qpair_abort_aers = nvme_rdma_admin_qpair_abort_aers, +}; + +SPDK_NVME_TRANSPORT_REGISTER(rdma, &rdma_ops); diff --git a/lib/nvme/nvme_tcp.c b/lib/nvme/nvme_tcp.c index 58205e8dd..97eb2cb89 100644 --- a/lib/nvme/nvme_tcp.c +++ b/lib/nvme/nvme_tcp.c @@ -1817,3 +1817,36 @@ nvme_tcp_admin_qpair_abort_aers(struct spdk_nvme_qpair *qpair) nvme_tcp_req_put(tqpair, tcp_req); } } + +const struct spdk_nvme_transport_ops tcp_ops = { + .name = "TCP", + .type = SPDK_NVME_TRANSPORT_TCP, + .ctrlr_construct = nvme_tcp_ctrlr_construct, + .ctrlr_scan = nvme_fabric_ctrlr_scan, + .ctrlr_destruct = nvme_tcp_ctrlr_destruct, + .ctrlr_enable = nvme_tcp_ctrlr_enable, + + .ctrlr_set_reg_4 = nvme_fabric_ctrlr_set_reg_4, + .ctrlr_set_reg_8 = nvme_fabric_ctrlr_set_reg_8, + .ctrlr_get_reg_4 = nvme_fabric_ctrlr_get_reg_4, + .ctrlr_get_reg_8 = nvme_fabric_ctrlr_get_reg_8, + + .ctrlr_get_max_xfer_size = nvme_tcp_ctrlr_get_max_xfer_size, + .ctrlr_get_max_sges = nvme_tcp_ctrlr_get_max_sges, + + .ctrlr_alloc_cmb_io_buffer = nvme_tcp_ctrlr_alloc_cmb_io_buffer, + .ctrlr_free_cmb_io_buffer = nvme_tcp_ctrlr_free_cmb_io_buffer, + + .ctrlr_create_io_qpair = nvme_tcp_ctrlr_create_io_qpair, + .ctrlr_delete_io_qpair = nvme_tcp_ctrlr_delete_io_qpair, + .ctrlr_connect_qpair = nvme_tcp_ctrlr_connect_qpair, + .ctrlr_disconnect_qpair = nvme_tcp_ctrlr_disconnect_qpair, + + .qpair_abort_reqs = nvme_tcp_qpair_abort_reqs, + .qpair_reset = nvme_tcp_qpair_reset, + .qpair_submit_request = nvme_tcp_qpair_submit_request, + .qpair_process_completions = nvme_tcp_qpair_process_completions, + .admin_qpair_abort_aers = nvme_tcp_admin_qpair_abort_aers, +}; + +SPDK_NVME_TRANSPORT_REGISTER(tcp, &tcp_ops); diff --git a/test/common/lib/nvme/common_stubs.h b/test/common/lib/nvme/common_stubs.h index 8e8bc78b7..89fc67498 100644 --- a/test/common/lib/nvme/common_stubs.h +++ b/test/common/lib/nvme/common_stubs.h @@ -67,3 +67,44 @@ spdk_nvme_transport_id_populate_trstring(struct spdk_nvme_transport_id *trid, co } return 0; } + +DEFINE_STUB(nvme_request_check_timeout, int, (struct nvme_request *req, uint16_t cid, + struct spdk_nvme_ctrlr_process *active_proc, uint64_t now_tick), 0); +DEFINE_STUB_V(nvme_ctrlr_destruct_finish, (struct spdk_nvme_ctrlr *ctrlr)); +DEFINE_STUB(nvme_ctrlr_construct, int, (struct spdk_nvme_ctrlr *ctrlr), 0); +DEFINE_STUB_V(nvme_ctrlr_destruct, (struct spdk_nvme_ctrlr *ctrlr)); +DEFINE_STUB_V(nvme_ctrlr_init_cap, (struct spdk_nvme_ctrlr *ctrlr, + const union spdk_nvme_cap_register *cap, + const union spdk_nvme_vs_register *vs)); +DEFINE_STUB(nvme_ctrlr_get_vs, int, (struct spdk_nvme_ctrlr *ctrlr, + union spdk_nvme_vs_register *vs), 0); +DEFINE_STUB(nvme_ctrlr_get_cap, int, (struct spdk_nvme_ctrlr *ctrlr, + union spdk_nvme_cap_register *cap), 0); +DEFINE_STUB(nvme_qpair_init, int, (struct spdk_nvme_qpair *qpair, uint16_t id, + struct spdk_nvme_ctrlr *ctrlr, + enum spdk_nvme_qprio qprio, + uint32_t num_requests), 0); +DEFINE_STUB_V(nvme_qpair_deinit, (struct spdk_nvme_qpair *qpair)); +DEFINE_STUB_V(spdk_nvme_transport_register, (const struct spdk_nvme_transport_ops *ops)); +DEFINE_STUB(nvme_transport_ctrlr_connect_qpair, int, (struct spdk_nvme_ctrlr *ctrlr, + struct spdk_nvme_qpair *qpair), 0); +DEFINE_STUB(spdk_nvme_ctrlr_get_current_process, struct spdk_nvme_ctrlr_process *, + (struct spdk_nvme_ctrlr *ctrlr), (struct spdk_nvme_ctrlr_process *)(uintptr_t)0x1); +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)); + +/* Fabric transports only */ +DEFINE_STUB_V(nvme_ctrlr_disconnect_qpair, (struct spdk_nvme_qpair *qpair)); +DEFINE_STUB(nvme_fabric_ctrlr_set_reg_4, int, (struct spdk_nvme_ctrlr *ctrlr, uint32_t offset, + uint32_t value), 0); +DEFINE_STUB(nvme_fabric_ctrlr_set_reg_8, int, (struct spdk_nvme_ctrlr *ctrlr, uint32_t offset, + uint64_t value), 0); +DEFINE_STUB(nvme_fabric_ctrlr_get_reg_4, int, (struct spdk_nvme_ctrlr *ctrlr, uint32_t offset, + uint32_t *value), 0); +DEFINE_STUB(nvme_fabric_ctrlr_get_reg_8, int, (struct spdk_nvme_ctrlr *ctrlr, uint32_t offset, + uint64_t *value), 0); +DEFINE_STUB(nvme_fabric_ctrlr_scan, int, (struct spdk_nvme_probe_ctx *probe_ctx, + bool direct_connect), 0); +DEFINE_STUB(nvme_fabric_qpair_connect, int, (struct spdk_nvme_qpair *qpair, uint32_t num_entries), + 0); diff --git a/test/unit/lib/nvme/nvme_pcie.c/nvme_pcie_ut.c b/test/unit/lib/nvme/nvme_pcie.c/nvme_pcie_ut.c index 121926893..3532fa9ec 100644 --- a/test/unit/lib/nvme/nvme_pcie.c/nvme_pcie_ut.c +++ b/test/unit/lib/nvme/nvme_pcie.c/nvme_pcie_ut.c @@ -40,6 +40,40 @@ #include "nvme/nvme_pcie.c" #include "common/lib/nvme/common_stubs.h" +pid_t g_spdk_nvme_pid; +DEFINE_STUB(spdk_mem_register, int, (void *vaddr, size_t len), 0); +DEFINE_STUB(spdk_mem_unregister, int, (void *vaddr, size_t len), 0); + +DEFINE_STUB(nvme_get_quirks, uint64_t, (const struct spdk_pci_id *id), 0); + +DEFINE_STUB(spdk_nvme_wait_for_completion, int, + (struct spdk_nvme_qpair *qpair, + struct nvme_completion_poll_status *status), 0); +DEFINE_STUB_V(nvme_completion_poll_cb, (void *arg, const struct spdk_nvme_cpl *cpl)); + +DEFINE_STUB(nvme_ctrlr_submit_admin_request, int, (struct spdk_nvme_ctrlr *ctrlr, + struct nvme_request *req), 0); +DEFINE_STUB_V(nvme_ctrlr_free_processes, (struct spdk_nvme_ctrlr *ctrlr)); +DEFINE_STUB(nvme_ctrlr_proc_get_devhandle, struct spdk_pci_device *, + (struct spdk_nvme_ctrlr *ctrlr), NULL); + +DEFINE_STUB(spdk_pci_device_map_bar, int, (struct spdk_pci_device *dev, uint32_t bar, + void **mapped_addr, uint64_t *phys_addr, uint64_t *size), 0); +DEFINE_STUB(spdk_pci_device_unmap_bar, int, (struct spdk_pci_device *dev, uint32_t bar, void *addr), + 0); +DEFINE_STUB(spdk_pci_device_attach, int, (struct spdk_pci_driver *driver, spdk_pci_enum_cb enum_cb, + void *enum_ctx, struct spdk_pci_addr *pci_address), 0); +DEFINE_STUB(spdk_pci_device_claim, int, (struct spdk_pci_device *dev), 0); +DEFINE_STUB_V(spdk_pci_device_unclaim, (struct spdk_pci_device *dev)); +DEFINE_STUB_V(spdk_pci_device_detach, (struct spdk_pci_device *device)); +DEFINE_STUB(spdk_pci_device_cfg_write32, int, (struct spdk_pci_device *dev, uint32_t value, + uint32_t offset), 0); +DEFINE_STUB(spdk_pci_device_cfg_read32, int, (struct spdk_pci_device *dev, uint32_t *value, + uint32_t offset), 0); +DEFINE_STUB(spdk_pci_device_get_id, struct spdk_pci_id, (struct spdk_pci_device *dev), {0}) + +DEFINE_STUB(spdk_uevent_connect, int, (void), 0); + struct spdk_log_flag SPDK_LOG_NVME = { .name = "nvme", .enabled = false, @@ -108,11 +142,8 @@ spdk_vtophys(void *buf, uint64_t *size) } DEFINE_STUB(spdk_pci_device_get_addr, struct spdk_pci_addr, (struct spdk_pci_device *dev), {}); -DEFINE_STUB(nvme_ctrlr_add_process, int, (struct spdk_nvme_ctrlr *ctrlr, void *devhandle), 0); DEFINE_STUB(nvme_ctrlr_probe, int, (const struct spdk_nvme_transport_id *trid, struct spdk_nvme_probe_ctx *probe_ctx, void *devhandle), 0); -DEFINE_STUB(spdk_nvme_ctrlr_get_current_process, struct spdk_nvme_ctrlr_process *, - (struct spdk_nvme_ctrlr *ctrlr), NULL); DEFINE_STUB(spdk_pci_device_is_removed, bool, (struct spdk_pci_device *dev), false); DEFINE_STUB(spdk_nvme_get_ctrlr_by_trid_unsafe, struct spdk_nvme_ctrlr *, (const struct spdk_nvme_transport_id *trid), NULL); @@ -125,8 +156,6 @@ DEFINE_STUB_V(spdk_nvme_qpair_print_command, (struct spdk_nvme_qpair *qpair, struct spdk_nvme_cmd *cmd)); DEFINE_STUB_V(spdk_nvme_qpair_print_completion, (struct spdk_nvme_qpair *qpair, struct spdk_nvme_cpl *cpl)); -DEFINE_STUB_V(spdk_nvme_trid_populate_transport, (struct spdk_nvme_transport_id *trid, - enum spdk_nvme_transport_type trtype)); static void prp_list_prep(struct nvme_tracker *tr, struct nvme_request *req, uint32_t *prp_index) diff --git a/test/unit/lib/nvme/nvme_rdma.c/nvme_rdma_ut.c b/test/unit/lib/nvme/nvme_rdma.c/nvme_rdma_ut.c index 8ecca2b6d..9a93e643e 100644 --- a/test/unit/lib/nvme/nvme_rdma.c/nvme_rdma_ut.c +++ b/test/unit/lib/nvme/nvme_rdma.c/nvme_rdma_ut.c @@ -40,10 +40,16 @@ SPDK_LOG_REGISTER_COMPONENT("nvme", SPDK_LOG_NVME) DEFINE_STUB(spdk_mem_map_set_translation, int, (struct spdk_mem_map *map, uint64_t vaddr, uint64_t size, uint64_t translation), 0); - DEFINE_STUB(spdk_mem_map_clear_translation, int, (struct spdk_mem_map *map, uint64_t vaddr, uint64_t size), 0); +DEFINE_STUB(spdk_mem_map_alloc, struct spdk_mem_map *, (uint64_t default_translation, + const struct spdk_mem_map_ops *ops, void *cb_ctx), NULL); +DEFINE_STUB_V(spdk_mem_map_free, (struct spdk_mem_map **pmap)); + +DEFINE_STUB_V(nvme_transport_ctrlr_disconnect_qpair, (struct spdk_nvme_ctrlr *ctrlr, + struct spdk_nvme_qpair *qpair)); + /* used to mock out having to split an SGL over a memory region */ uint64_t g_mr_size; struct ibv_mr g_nvme_rdma_mr; diff --git a/test/unit/lib/nvme/nvme_tcp.c/nvme_tcp_ut.c b/test/unit/lib/nvme/nvme_tcp.c/nvme_tcp_ut.c index 2b33a3bec..e36c80e69 100644 --- a/test/unit/lib/nvme/nvme_tcp.c/nvme_tcp_ut.c +++ b/test/unit/lib/nvme/nvme_tcp.c/nvme_tcp_ut.c @@ -42,17 +42,9 @@ SPDK_LOG_REGISTER_COMPONENT("nvme", SPDK_LOG_NVME); -DEFINE_STUB(nvme_request_check_timeout, int, (struct nvme_request *req, uint16_t cid, - struct spdk_nvme_ctrlr_process *active_proc, uint64_t now_tick), 1); - DEFINE_STUB(nvme_qpair_submit_request, int, (struct spdk_nvme_qpair *qpair, struct nvme_request *req), 0); -DEFINE_STUB(spdk_nvme_ctrlr_get_current_process, struct spdk_nvme_ctrlr_process *, - (struct spdk_nvme_ctrlr *ctrlr), (struct spdk_nvme_ctrlr_process *)(uintptr_t)0x1); - -DEFINE_STUB_V(nvme_ctrlr_disconnect_qpair, (struct spdk_nvme_qpair *qpair)); - static void test_nvme_tcp_pdu_set_data_buf(void) {