From 65e56caa17ed45459ff70ea619c69118696a59cf Mon Sep 17 00:00:00 2001 From: Changpeng Liu Date: Thu, 17 May 2018 13:16:42 -0400 Subject: [PATCH] nvme: wrapper request completion callback into a function When IO is finished SPDK will trigger callback at controller layer, while here, wrapper the completion callback into a function so that we can add error injection at this function in following patch. Change-Id: I7b7a6d278d87fd09a05f51f688398fdf2e9c4e05 Signed-off-by: Changpeng Liu Reviewed-on: https://review.gerrithub.io/411630 Tested-by: SPDK Automated Test System Reviewed-by: Daniel Verkamp Reviewed-by: Jim Harris --- lib/nvme/nvme_ctrlr_cmd.c | 3 +-- lib/nvme/nvme_internal.h | 1 + lib/nvme/nvme_ns_cmd.c | 4 +--- lib/nvme/nvme_pcie.c | 9 ++------- lib/nvme/nvme_qpair.c | 13 +++++++++---- lib/nvme/nvme_rdma.c | 2 +- .../lib/nvme/nvme_ctrlr_cmd.c/nvme_ctrlr_cmd_ut.c | 8 ++++++++ test/unit/lib/nvme/nvme_ns_cmd.c/nvme_ns_cmd_ut.c | 8 ++++++++ test/unit/lib/nvme/nvme_pcie.c/nvme_pcie_ut.c | 6 ++++++ 9 files changed, 37 insertions(+), 17 deletions(-) diff --git a/lib/nvme/nvme_ctrlr_cmd.c b/lib/nvme/nvme_ctrlr_cmd.c index 857165c50..fc02c4cf7 100644 --- a/lib/nvme/nvme_ctrlr_cmd.c +++ b/lib/nvme/nvme_ctrlr_cmd.c @@ -470,8 +470,7 @@ spdk_nvme_ctrlr_cmd_abort_cpl(void *ctx, const struct spdk_nvme_cpl *cpl) next->cpl.status.sct = SPDK_NVME_SCT_GENERIC; next->cpl.status.sc = SPDK_NVME_SC_INTERNAL_DEVICE_ERROR; next->cpl.status.dnr = 1; - next->cb_fn(next->cb_arg, &req->cpl); - + nvme_complete_request(next, &req->cpl); nvme_free_request(next); } else { /* If the first abort succeeds, stop iterating. */ diff --git a/lib/nvme/nvme_internal.h b/lib/nvme/nvme_internal.h index 821eb32bb..98d24a030 100644 --- a/lib/nvme/nvme_internal.h +++ b/lib/nvme/nvme_internal.h @@ -626,6 +626,7 @@ struct nvme_request *nvme_allocate_request_contig(struct spdk_nvme_qpair *qpair, struct nvme_request *nvme_allocate_request_user_copy(struct spdk_nvme_qpair *qpair, void *buffer, uint32_t payload_size, spdk_nvme_cmd_cb cb_fn, void *cb_arg, bool host_to_controller); +void nvme_complete_request(struct nvme_request *req, struct spdk_nvme_cpl *cpl); void nvme_free_request(struct nvme_request *req); void nvme_request_remove_child(struct nvme_request *parent, struct nvme_request *child); uint64_t nvme_get_quirks(const struct spdk_pci_id *id); diff --git a/lib/nvme/nvme_ns_cmd.c b/lib/nvme/nvme_ns_cmd.c index 7f39a71f0..e4a9ab846 100644 --- a/lib/nvme/nvme_ns_cmd.c +++ b/lib/nvme/nvme_ns_cmd.c @@ -52,9 +52,7 @@ nvme_cb_complete_child(void *child_arg, const struct spdk_nvme_cpl *cpl) } if (parent->num_children == 0) { - if (parent->cb_fn) { - parent->cb_fn(parent->cb_arg, &parent->parent_status); - } + nvme_complete_request(parent, &parent->parent_status); nvme_free_request(parent); } } diff --git a/lib/nvme/nvme_pcie.c b/lib/nvme/nvme_pcie.c index 40fe21e11..6f9bad1af 100644 --- a/lib/nvme/nvme_pcie.c +++ b/lib/nvme/nvme_pcie.c @@ -1129,10 +1129,7 @@ nvme_pcie_qpair_complete_pending_admin_request(struct spdk_nvme_qpair *qpair) assert(req->pid == pid); - if (req->cb_fn) { - req->cb_fn(req->cb_arg, &req->cpl); - } - + nvme_complete_request(req, &req->cpl); nvme_free_request(req); } } @@ -1238,9 +1235,7 @@ nvme_pcie_qpair_complete_tracker(struct spdk_nvme_qpair *qpair, struct nvme_trac req_from_current_proc = false; nvme_pcie_qpair_insert_pending_admin_request(qpair, req, cpl); } else { - if (req->cb_fn) { - req->cb_fn(req->cb_arg, cpl); - } + nvme_complete_request(req, cpl); } } diff --git a/lib/nvme/nvme_qpair.c b/lib/nvme/nvme_qpair.c index 3a32b2c8d..2120243f1 100644 --- a/lib/nvme/nvme_qpair.c +++ b/lib/nvme/nvme_qpair.c @@ -347,10 +347,7 @@ nvme_qpair_manual_complete_request(struct spdk_nvme_qpair *qpair, nvme_qpair_print_completion(qpair, &cpl); } - if (req->cb_fn) { - req->cb_fn(req->cb_arg, &cpl); - } - + nvme_complete_request(req, &cpl); nvme_free_request(req); } @@ -451,6 +448,14 @@ nvme_qpair_submit_request(struct spdk_nvme_qpair *qpair, struct nvme_request *re return nvme_transport_qpair_submit_request(qpair, req); } +void +nvme_complete_request(struct nvme_request *req, struct spdk_nvme_cpl *cpl) +{ + if (req->cb_fn) { + req->cb_fn(req->cb_arg, cpl); + } +} + static void _nvme_io_qpair_enable(struct spdk_nvme_qpair *qpair) { diff --git a/lib/nvme/nvme_rdma.c b/lib/nvme/nvme_rdma.c index 74b1009f9..d585342ae 100644 --- a/lib/nvme/nvme_rdma.c +++ b/lib/nvme/nvme_rdma.c @@ -187,7 +187,7 @@ static void nvme_rdma_req_complete(struct nvme_request *req, struct spdk_nvme_cpl *rsp) { - req->cb_fn(req->cb_arg, rsp); + nvme_complete_request(req, rsp); nvme_free_request(req); } diff --git a/test/unit/lib/nvme/nvme_ctrlr_cmd.c/nvme_ctrlr_cmd_ut.c b/test/unit/lib/nvme/nvme_ctrlr_cmd.c/nvme_ctrlr_cmd_ut.c index 913f449e7..4be3fcefb 100644 --- a/test/unit/lib/nvme/nvme_ctrlr_cmd.c/nvme_ctrlr_cmd_ut.c +++ b/test/unit/lib/nvme/nvme_ctrlr_cmd.c/nvme_ctrlr_cmd_ut.c @@ -293,6 +293,14 @@ nvme_allocate_request_user_copy(struct spdk_nvme_qpair *qpair, void *buffer, uin return nvme_allocate_request_contig(qpair, buffer, payload_size, cb_fn, cb_arg); } +void +nvme_complete_request(struct nvme_request *req, struct spdk_nvme_cpl *cpl) +{ + if (req->cb_fn) { + req->cb_fn(req->cb_arg, cpl); + } +} + void nvme_free_request(struct nvme_request *req) { diff --git a/test/unit/lib/nvme/nvme_ns_cmd.c/nvme_ns_cmd_ut.c b/test/unit/lib/nvme/nvme_ns_cmd.c/nvme_ns_cmd_ut.c index 445972de7..567e762c6 100644 --- a/test/unit/lib/nvme/nvme_ns_cmd.c/nvme_ns_cmd_ut.c +++ b/test/unit/lib/nvme/nvme_ns_cmd.c/nvme_ns_cmd_ut.c @@ -183,6 +183,14 @@ nvme_transport_ctrlr_scan(const struct spdk_nvme_transport_id *trid, return 0; } +void +nvme_complete_request(struct nvme_request *req, struct spdk_nvme_cpl *cpl) +{ + if (req->cb_fn) { + req->cb_fn(req->cb_arg, cpl); + } +} + static void prepare_for_test(struct spdk_nvme_ns *ns, struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qpair *qpair, 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 2f95b65d4..69e5b2506 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 @@ -294,6 +294,12 @@ nvme_qpair_enable(struct spdk_nvme_qpair *qpair) abort(); } +void +nvme_complete_request(struct nvme_request *req, struct spdk_nvme_cpl *cpl) +{ + abort(); +} + struct spdk_nvme_ctrlr * spdk_nvme_get_ctrlr_by_trid_unsafe(const struct spdk_nvme_transport_id *trid) {