Commit 209a0cac authored by Xupeng Mingtu's avatar Xupeng Mingtu Committed by Jim Harris
Browse files

nvme/rdma: Add a field to mark a nvme_rdma_qpair used by an established connection



In some scenarios, nvme_rdma may wait for a RDMA_CM_EVENT_DISCONNECTED
event that may never arrive, for example:
        1. When the target actively disconnects the rdma connection
        2. Resetting controller but failed to establish RDMA connection
This newly added field is used to decide whether to wait for
RDMA_CM_EVENT_DISCONNECTED when closing the connection

Fixes issue #3592

This restores commit ea1b9074.

Change-Id: Ib9197032cdee4ab5b71a5cde4f1f723b4d5a0b8c
Signed-off-by: default avatarXupeng Mingtu <xupeng9@staff.sina.com>
Reviewed-on: https://review.spdk.io/c/spdk/spdk/+/25921


Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Reviewed-by: default avatarKonrad Sztyber <ksztyber@nvidia.com>
Reviewed-by: default avatarJim Harris <jim.harris@nvidia.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
Tested-by: default avatarSPDK Automated Test System <spdkbot@gmail.com>
parent 1b3f0fee
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -240,6 +240,7 @@ struct nvme_rdma_qpair {

	uint8_t					stale_conn_retry_count;
	bool					need_destroy;
	bool					connected;
	TAILQ_ENTRY(nvme_rdma_qpair)		link_connecting;
};

@@ -452,6 +453,7 @@ nvme_rdma_qpair_process_cm_event(struct nvme_rdma_qpair *rqpair)
			rc = spdk_rdma_provider_qp_complete_connect(rqpair->rdma_qp);
		/* fall through */
		case RDMA_CM_EVENT_ESTABLISHED:
			rqpair->connected = true;
			accept_data = (struct spdk_nvmf_rdma_accept_private_data *)event->param.conn.private_data;
			if (accept_data == NULL) {
				rc = -1;
@@ -461,6 +463,7 @@ nvme_rdma_qpair_process_cm_event(struct nvme_rdma_qpair *rqpair)
			}
			break;
		case RDMA_CM_EVENT_DISCONNECTED:
			rqpair->connected = false;
			rqpair->qpair.transport_failure_reason = SPDK_NVME_QPAIR_FAILURE_REMOTE;
			break;
		case RDMA_CM_EVENT_DEVICE_REMOVAL:
@@ -2188,7 +2191,7 @@ _nvme_rdma_ctrlr_disconnect_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvm
	rqpair->state = NVME_RDMA_QPAIR_STATE_EXITING;

	if (rqpair->cm_id) {
		if (rqpair->rdma_qp) {
		if (rqpair->rdma_qp && rqpair->connected) {
			rc = spdk_rdma_provider_qp_disconnect(rqpair->rdma_qp);
			if ((qpair->ctrlr != NULL) && (rc == 0)) {
				rc = nvme_rdma_process_event_start(rqpair, RDMA_CM_EVENT_DISCONNECTED,