nvme_rdma: Add callback to nvme_rdma_process_event()

Change-Id: I66aa89dc54d5aaedbe2f06239cbf04aeeb2c739e
Signed-off-by: Shuhei Matsumoto <smatsumoto@nvidia.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/11359
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Community-CI: Mellanox Build Bot
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@mellanox.com>
This commit is contained in:
Shuhei Matsumoto 2022-02-08 11:21:01 +09:00 committed by Tomasz Zawadzki
parent bcf0845727
commit cf7f253302

View File

@ -191,6 +191,8 @@ enum nvme_rdma_qpair_state {
NVME_RDMA_QPAIR_STATE_RUNNING, NVME_RDMA_QPAIR_STATE_RUNNING,
}; };
typedef int (*nvme_rdma_cm_event_cb)(struct nvme_rdma_qpair *rqpair, int ret);
/* NVMe RDMA qpair extensions for spdk_nvme_qpair */ /* NVMe RDMA qpair extensions for spdk_nvme_qpair */
struct nvme_rdma_qpair { struct nvme_rdma_qpair {
struct spdk_nvme_qpair qpair; struct spdk_nvme_qpair qpair;
@ -631,7 +633,8 @@ nvme_rdma_validate_cm_event(enum rdma_cm_event_type expected_evt_type,
static int static int
nvme_rdma_process_event(struct nvme_rdma_qpair *rqpair, nvme_rdma_process_event(struct nvme_rdma_qpair *rqpair,
enum rdma_cm_event_type evt) enum rdma_cm_event_type evt,
nvme_rdma_cm_event_cb evt_cb)
{ {
struct nvme_rdma_ctrlr *rctrlr; struct nvme_rdma_ctrlr *rctrlr;
uint64_t timeout_ticks; uint64_t timeout_ticks;
@ -640,7 +643,7 @@ nvme_rdma_process_event(struct nvme_rdma_qpair *rqpair,
if (rqpair->evt != NULL) { if (rqpair->evt != NULL) {
rc = nvme_rdma_qpair_process_cm_event(rqpair); rc = nvme_rdma_qpair_process_cm_event(rqpair);
if (rc) { if (rc) {
return rc; goto exit;
} }
} }
@ -654,18 +657,23 @@ nvme_rdma_process_event(struct nvme_rdma_qpair *rqpair,
} }
if (rc) { if (rc) {
return rc; goto exit;
} }
if (rqpair->evt == NULL) { if (rqpair->evt == NULL) {
return -EADDRNOTAVAIL; rc = -EADDRNOTAVAIL;
goto exit;
} }
rc = nvme_rdma_validate_cm_event(evt, rqpair->evt); rc = nvme_rdma_validate_cm_event(evt, rqpair->evt);
rc2 = nvme_rdma_qpair_process_cm_event(rqpair); rc2 = nvme_rdma_qpair_process_cm_event(rqpair);
/* bad message takes precedence over the other error codes from processing the event. */ /* bad message takes precedence over the other error codes from processing the event. */
return rc == 0 ? rc2 : rc; rc = rc == 0 ? rc2 : rc;
exit:
assert(evt_cb != NULL);
return evt_cb(rqpair, rc);
} }
static int static int
@ -1124,9 +1132,8 @@ nvme_rdma_addr_resolved(struct nvme_rdma_qpair *rqpair, int ret)
return ret; return ret;
} }
ret = nvme_rdma_process_event(rqpair, RDMA_CM_EVENT_ROUTE_RESOLVED); return nvme_rdma_process_event(rqpair, RDMA_CM_EVENT_ROUTE_RESOLVED,
nvme_rdma_route_resolved);
return nvme_rdma_route_resolved(rqpair, ret);
} }
static int static int
@ -1143,9 +1150,8 @@ nvme_rdma_resolve_addr(struct nvme_rdma_qpair *rqpair,
return ret; return ret;
} }
ret = nvme_rdma_process_event(rqpair, RDMA_CM_EVENT_ADDR_RESOLVED); return nvme_rdma_process_event(rqpair, RDMA_CM_EVENT_ADDR_RESOLVED,
nvme_rdma_addr_resolved);
return nvme_rdma_addr_resolved(rqpair, ret);
} }
static int static int
@ -1227,9 +1233,8 @@ nvme_rdma_connect(struct nvme_rdma_qpair *rqpair)
return ret; return ret;
} }
ret = nvme_rdma_process_event(rqpair, RDMA_CM_EVENT_ESTABLISHED); return nvme_rdma_process_event(rqpair, RDMA_CM_EVENT_ESTABLISHED,
nvme_rdma_connect_established);
return nvme_rdma_connect_established(rqpair, ret);
} }
static int static int
@ -1827,6 +1832,10 @@ nvme_rdma_ctrlr_create_qpair(struct spdk_nvme_ctrlr *ctrlr,
static int static int
nvme_rdma_qpair_disconnected(struct nvme_rdma_qpair *rqpair, int ret) nvme_rdma_qpair_disconnected(struct nvme_rdma_qpair *rqpair, int ret)
{ {
if (ret) {
SPDK_DEBUGLOG(nvme, "Target did not respond to qpair disconnect.\n");
}
if (rqpair->cm_id) { if (rqpair->cm_id) {
if (rqpair->rdma_qp) { if (rqpair->rdma_qp) {
spdk_rdma_qp_destroy(rqpair->rdma_qp); spdk_rdma_qp_destroy(rqpair->rdma_qp);
@ -1883,9 +1892,9 @@ nvme_rdma_ctrlr_disconnect_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme
if (rqpair->rdma_qp) { if (rqpair->rdma_qp) {
rc = spdk_rdma_qp_disconnect(rqpair->rdma_qp); rc = spdk_rdma_qp_disconnect(rqpair->rdma_qp);
if ((rctrlr != NULL) && (rc == 0)) { if ((rctrlr != NULL) && (rc == 0)) {
if (nvme_rdma_process_event(rqpair, RDMA_CM_EVENT_DISCONNECTED)) { nvme_rdma_process_event(rqpair, RDMA_CM_EVENT_DISCONNECTED,
SPDK_DEBUGLOG(nvme, "Target did not respond to qpair disconnect.\n"); nvme_rdma_qpair_disconnected);
} return;
} }
} }
} }