Re: [PATCH 09/31] rdma/siw: use __siw_cep_terminate_upcall() for SIW_CM_WORK_PEER_CLOSE

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



-----"Stefan Metzmacher" <metze@xxxxxxxxx> wrote: -----

>To: "Bernard Metzler" <bmt@xxxxxxxxxxxxxx>
>From: "Stefan Metzmacher" <metze@xxxxxxxxx>
>Date: 05/07/2021 01:38AM
>Cc: linux-rdma@xxxxxxxxxxxxxxx, "Stefan Metzmacher" <metze@xxxxxxxxx>
>Subject: [EXTERNAL] [PATCH 09/31] rdma/siw: use
>__siw_cep_terminate_upcall() for SIW_CM_WORK_PEER_CLOSE
>
>It's easier to have generic logic in just one place.
>
>Fixes: 6c52fdc244b5 ("rdma/siw: connection management")
>Signed-off-by: Stefan Metzmacher <metze@xxxxxxxxx>
>Cc: Bernard Metzler <bmt@xxxxxxxxxxxxxx>
>Cc: linux-rdma@xxxxxxxxxxxxxxx
>---
> drivers/infiniband/sw/siw/siw_cm.c | 89
>+++++++++++++++++-------------
> 1 file changed, 50 insertions(+), 39 deletions(-)
>
>diff --git a/drivers/infiniband/sw/siw/siw_cm.c
>b/drivers/infiniband/sw/siw/siw_cm.c
>index b7e7f637bd03..5338be450285 100644
>--- a/drivers/infiniband/sw/siw/siw_cm.c
>+++ b/drivers/infiniband/sw/siw/siw_cm.c
>@@ -110,26 +110,67 @@ static void siw_socket_disassoc(struct socket
>*s)
> static void __siw_cep_terminate_upcall(struct siw_cep *cep,
> 				       int reply_status)
> {
>-	if (cep->qp && cep->qp->term_info.valid)
>-		siw_send_terminate(cep->qp);
>+	bool suspended = false;

this is development debugging only. please remove it.

>+
>+	if (cep->qp) {
>+		struct siw_qp *qp = cep->qp;
>+
>+		if (qp->term_info.valid)
>+			siw_send_terminate(qp);
>+
>+		if (qp->rx_stream.rx_suspend || qp->tx_ctx.tx_suspend)
>+			suspended = true;
>+	} else {
>+		suspended = true;
>+	}

This block is not needed.
> 
> 	switch (cep->state) {
> 	case SIW_EPSTATE_AWAIT_MPAREP:
>+		/*
>+		 * MPA reply not received, but connection drop,
>+		 * or timeout.
>+		 */
> 		siw_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY,
> 			      reply_status);
> 		break;
> 
> 	case SIW_EPSTATE_RDMA_MODE:
>+		/*
>+		 * NOTE: IW_CM_EVENT_DISCONNECT is given just
>+		 *       to transition IWCM into CLOSING.
>+		 */
>+		WARN(!suspended, "SIW_EPSTATE_RDMA_MODE called without
>suspended\n");

Please remove this development debugging. also below.

>+		siw_cm_upcall(cep, IW_CM_EVENT_DISCONNECT, 0);
> 		siw_cm_upcall(cep, IW_CM_EVENT_CLOSE, 0);
> 		break;
> 
>+	case SIW_EPSTATE_RECVD_MPAREQ:
>+		/*
>+		 * Wait for the ulp/CM to call accept/reject
>+		 */
>+		siw_dbg_cep(cep, "mpa req recvd, wait for ULP\n");
>+		WARN(!suspended, "SIW_EPSTATE_RECVD_MPAREQ called without
>suspended\n");
>+		break;
>+
>+	case SIW_EPSTATE_AWAIT_MPAREQ:
>+		/*
>+		 * Socket close before MPA request received.
>+		 */
>+		siw_dbg_cep(cep, "no mpareq: drop listener\n");
>+		if (cep->listen_cep)
>+			siw_cep_put(cep->listen_cep);
>+		cep->listen_cep = NULL;
>+		break;
>+
> 	case SIW_EPSTATE_IDLE:
> 	case SIW_EPSTATE_LISTENING:
> 	case SIW_EPSTATE_CONNECTING:
>-	case SIW_EPSTATE_AWAIT_MPAREQ:
>-	case SIW_EPSTATE_RECVD_MPAREQ:
> 	case SIW_EPSTATE_CLOSED:
> 	default:
>+		/*
>+		 * for other states there is no connection
>+		 * known to the IWCM.
>+		 */
> 		break;
> 	}
> }
>@@ -1077,41 +1118,11 @@ static void siw_cm_work_handler(struct
>work_struct *w)
> 		break;
> 
> 	case SIW_CM_WORK_PEER_CLOSE:
>-		if (cep->cm_id) {
>-			if (cep->state == SIW_EPSTATE_AWAIT_MPAREP) {
>-				/*
>-				 * MPA reply not received, but connection drop
>-				 */
>-				siw_cm_upcall(cep, IW_CM_EVENT_CONNECT_REPLY,
>-					      -ECONNRESET);
>-			} else if (cep->state == SIW_EPSTATE_RDMA_MODE) {
>-				/*
>-				 * NOTE: IW_CM_EVENT_DISCONNECT is given just
>-				 *       to transition IWCM into CLOSING.
>-				 */
>-				siw_cm_upcall(cep, IW_CM_EVENT_DISCONNECT, 0);
>-				siw_cm_upcall(cep, IW_CM_EVENT_CLOSE, 0);
>-			}
>-			/*
>-			 * for other states there is no connection
>-			 * known to the IWCM.
>-			 */
>-		} else {
>-			if (cep->state == SIW_EPSTATE_RECVD_MPAREQ) {
>-				/*
>-				 * Wait for the ulp/CM to call accept/reject
>-				 */
>-				siw_dbg_cep(cep,
>-					    "mpa req recvd, wait for ULP\n");
>-			} else if (cep->state == SIW_EPSTATE_AWAIT_MPAREQ) {
>-				/*
>-				 * Socket close before MPA request received.
>-				 */
>-				siw_dbg_cep(cep, "no mpareq: drop listener\n");
>-				siw_cep_put(cep->listen_cep);
>-				cep->listen_cep = NULL;
>-			}
>-		}
>+		/*
>+		 * Peer closed the connection: TCP_CLOSE*
>+		 */
>+		__siw_cep_terminate_upcall(cep, -ECONNRESET);
>+
> 		release_cep = 1;
> 		break;
> 
>-- 
>2.25.1
>
>





[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux