diff --git a/lib/nvme/nvme_internal.h b/lib/nvme/nvme_internal.h index e94b6968b..fe920d217 100644 --- a/lib/nvme/nvme_internal.h +++ b/lib/nvme/nvme_internal.h @@ -3,7 +3,7 @@ * * Copyright (c) Intel Corporation. All rights reserved. * Copyright (c) 2020, 2021 Mellanox Technologies LTD. All rights reserved. - * Copyright (c) 2021 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * Copyright (c) 2021, 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -1515,6 +1515,7 @@ int nvme_transport_ctrlr_connect_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qpair *qpair); void nvme_transport_ctrlr_disconnect_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qpair *qpair); +void nvme_transport_ctrlr_disconnect_qpair_done(struct spdk_nvme_qpair *qpair); int nvme_transport_ctrlr_get_memory_domains(const struct spdk_nvme_ctrlr *ctrlr, struct spdk_memory_domain **domains, int array_size); void nvme_transport_qpair_abort_reqs(struct spdk_nvme_qpair *qpair, uint32_t dnr); diff --git a/lib/nvme/nvme_pcie_common.c b/lib/nvme/nvme_pcie_common.c index e934bc789..4a9bd749b 100644 --- a/lib/nvme/nvme_pcie_common.c +++ b/lib/nvme/nvme_pcie_common.c @@ -602,6 +602,7 @@ nvme_pcie_ctrlr_connect_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qp void nvme_pcie_ctrlr_disconnect_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qpair *qpair) { + nvme_transport_ctrlr_disconnect_qpair_done(qpair); } /* Used when dst points to MMIO (i.e. CMB) in a virtual machine - in these cases we must diff --git a/lib/nvme/nvme_rdma.c b/lib/nvme/nvme_rdma.c index cd78a1d92..ee68ecccb 100644 --- a/lib/nvme/nvme_rdma.c +++ b/lib/nvme/nvme_rdma.c @@ -1849,6 +1849,8 @@ nvme_rdma_ctrlr_disconnect_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme ibv_destroy_cq(rqpair->cq); rqpair->cq = NULL; } + + nvme_transport_ctrlr_disconnect_qpair_done(qpair); } static void nvme_rdma_qpair_abort_reqs(struct spdk_nvme_qpair *qpair, uint32_t dnr); diff --git a/lib/nvme/nvme_tcp.c b/lib/nvme/nvme_tcp.c index 0dcc4bf9b..75877b0ba 100644 --- a/lib/nvme/nvme_tcp.c +++ b/lib/nvme/nvme_tcp.c @@ -344,6 +344,8 @@ nvme_tcp_ctrlr_disconnect_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_ */ TAILQ_REMOVE(&tqpair->send_queue, pdu, tailq); } + + nvme_transport_ctrlr_disconnect_qpair_done(qpair); } static void nvme_tcp_qpair_abort_reqs(struct spdk_nvme_qpair *qpair, uint32_t dnr); diff --git a/lib/nvme/nvme_transport.c b/lib/nvme/nvme_transport.c index 925d9b628..cb1c0728e 100644 --- a/lib/nvme/nvme_transport.c +++ b/lib/nvme/nvme_transport.c @@ -465,7 +465,6 @@ nvme_transport_connect_qpair_fail(struct spdk_nvme_qpair *qpair, void *unused) /* If the qpair was unable to reconnect, restore the original failure reason */ qpair->transport_failure_reason = qpair->last_transport_failure_reason; nvme_transport_ctrlr_disconnect_qpair(ctrlr, qpair); - nvme_qpair_set_state(qpair, NVME_QPAIR_DISCONNECTED); } int @@ -535,7 +534,11 @@ nvme_transport_ctrlr_disconnect_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk } transport->ops.ctrlr_disconnect_qpair(ctrlr, qpair); +} +void +nvme_transport_ctrlr_disconnect_qpair_done(struct spdk_nvme_qpair *qpair) +{ nvme_qpair_abort_all_queued_reqs(qpair, 0); nvme_transport_qpair_abort_reqs(qpair, 0); nvme_qpair_set_state(qpair, NVME_QPAIR_DISCONNECTED); diff --git a/test/common/lib/nvme/common_stubs.h b/test/common/lib/nvme/common_stubs.h index ef96b631b..f71337cbe 100644 --- a/test/common/lib/nvme/common_stubs.h +++ b/test/common/lib/nvme/common_stubs.h @@ -3,6 +3,7 @@ * * Copyright (c) Intel Corporation. * All rights reserved. + * Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -81,6 +82,7 @@ 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_V(nvme_transport_ctrlr_disconnect_qpair_done, (struct spdk_nvme_qpair *qpair)); DEFINE_STUB(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); diff --git a/test/unit/lib/nvme/nvme_pcie_common.c/nvme_pcie_common_ut.c b/test/unit/lib/nvme/nvme_pcie_common.c/nvme_pcie_common_ut.c index 7f8ebba33..aeb7583d2 100644 --- a/test/unit/lib/nvme/nvme_pcie_common.c/nvme_pcie_common_ut.c +++ b/test/unit/lib/nvme/nvme_pcie_common.c/nvme_pcie_common_ut.c @@ -3,6 +3,7 @@ * * Copyright (c) Intel Corporation. * All rights reserved. + * Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -74,6 +75,8 @@ DEFINE_STUB(nvme_request_check_timeout, int, (struct nvme_request *req, uint16_t struct spdk_nvme_ctrlr_process *active_proc, uint64_t now_tick), 0); DEFINE_STUB(spdk_strerror, const char *, (int errnum), NULL); +DEFINE_STUB_V(nvme_transport_ctrlr_disconnect_qpair_done, (struct spdk_nvme_qpair *qpair)); + int nvme_qpair_init(struct spdk_nvme_qpair *qpair, uint16_t id, struct spdk_nvme_ctrlr *ctrlr, enum spdk_nvme_qprio qprio,