svn commit: r349795 - stable/12/sys/dev/cxgbe/tom

Navdeep Parhar np at FreeBSD.org
Sun Jul 7 00:30:22 UTC 2019


Author: np
Date: Sun Jul  7 00:30:20 2019
New Revision: 349795
URL: https://svnweb.freebsd.org/changeset/base/349795

Log:
  MFC r349242, r349501, r349514, and r349517.
  
  r349242:
  cxgbe/t4_tom: DDP_DEAD is a ddp flag and not a toepcb flag.
  
  The driver was in effect setting TPF_ABORT_SHUTDOWN on the toepcb
  instead of what was intended.
  
  Sponsored by:	Chelsio Communications
  
  r349501:
  cxgbe/t4_tom: Mark the socket's receive as done before calling
  handle_ddp_close.
  
  This eliminates a bad race where an aio_ddp_requeue that happened to run
  after handle_ddp_close could bump up the active count.
  
  Discussed with:	jhb@
  Sponsored by:	Chelsio Communications
  
  r349514:
  cxgbe/t4_tom: the AIO tx job queue must be empty by the time the driver
  releases the offload resources associated with the tid.
  
  Reviewed by:	jhb@
  Sponsored by:	Chelsio Communications
  Differential Revision:	https://reviews.freebsd.org/D20798
  
  r349517:
  cxgbe/t4_tom: Tweaks to some of the AIO related CTRs.
  
  Reviewed by:	jhb@
  Sponsored by:	Chelsio Communications

Modified:
  stable/12/sys/dev/cxgbe/tom/t4_cpl_io.c
  stable/12/sys/dev/cxgbe/tom/t4_ddp.c
  stable/12/sys/dev/cxgbe/tom/t4_tom.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/dev/cxgbe/tom/t4_cpl_io.c
==============================================================================
--- stable/12/sys/dev/cxgbe/tom/t4_cpl_io.c	Sat Jul  6 20:31:37 2019	(r349794)
+++ stable/12/sys/dev/cxgbe/tom/t4_cpl_io.c	Sun Jul  7 00:30:20 2019	(r349795)
@@ -722,8 +722,8 @@ t4_push_frames(struct adapter *sc, struct toepcb *toep
 	    ("%s: ulp_mode %u for toep %p", __func__, toep->ulp_mode, toep));
 
 #ifdef VERBOSE_TRACES
-	CTR4(KTR_CXGBE, "%s: tid %d toep flags %#x tp flags %#x drop %d",
-	    __func__, toep->tid, toep->flags, tp->t_flags);
+	CTR5(KTR_CXGBE, "%s: tid %d toep flags %#x tp flags %#x drop %d",
+	    __func__, toep->tid, toep->flags, tp->t_flags, drop);
 #endif
 	if (__predict_false(toep->flags & TPF_ABORT_SHUTDOWN))
 		return;
@@ -1242,8 +1242,10 @@ do_peer_close(struct sge_iq *iq, const struct rss_head
 	INP_WLOCK(inp);
 	tp = intotcpcb(inp);
 
-	CTR5(KTR_CXGBE, "%s: tid %u (%s), toep_flags 0x%x, inp %p", __func__,
-	    tid, tp ? tcpstates[tp->t_state] : "no tp", toep->flags, inp);
+	CTR6(KTR_CXGBE,
+	    "%s: tid %u (%s), toep_flags 0x%x, ddp_flags 0x%x, inp %p",
+	    __func__, tid, tp ? tcpstates[tp->t_state] : "no tp", toep->flags,
+	    toep->ddp.flags, inp);
 
 	if (toep->flags & TPF_ABORT_SHUTDOWN)
 		goto done;
@@ -1251,6 +1253,7 @@ do_peer_close(struct sge_iq *iq, const struct rss_head
 	tp->rcv_nxt++;	/* FIN */
 
 	so = inp->inp_socket;
+	socantrcvmore(so);
 	if (toep->ulp_mode == ULP_MODE_TCPDDP) {
 		DDP_LOCK(toep);
 		if (__predict_false(toep->ddp.flags &
@@ -1258,7 +1261,6 @@ do_peer_close(struct sge_iq *iq, const struct rss_head
 			handle_ddp_close(toep, tp, cpl->rcv_nxt);
 		DDP_UNLOCK(toep);
 	}
-	socantrcvmore(so);
 
 	if (toep->ulp_mode != ULP_MODE_RDMA) {
 		KASSERT(tp->rcv_nxt == be32toh(cpl->rcv_nxt),
@@ -2223,7 +2225,7 @@ t4_aiotx_queue_toep(struct toepcb *toep)
 	SOCKBUF_LOCK_ASSERT(&toep->inp->inp_socket->so_snd);
 #ifdef VERBOSE_TRACES
 	CTR3(KTR_CXGBE, "%s: queueing aiotx task for tid %d, active = %s",
-	    __func__, toep->tid, toep->aiotx_task_active ? "true" : "false");
+	    __func__, toep->tid, toep->aiotx_so != NULL ? "true" : "false");
 #endif
 	if (toep->aiotx_task_active)
 		return;
@@ -2278,7 +2280,7 @@ t4_aio_queue_aiotx(struct socket *so, struct kaiocb *j
 
 	SOCKBUF_LOCK(&so->so_snd);
 #ifdef VERBOSE_TRACES
-	CTR2(KTR_CXGBE, "%s: queueing %p", __func__, job);
+	CTR3(KTR_CXGBE, "%s: queueing %p for tid %u", __func__, job, toep->tid);
 #endif
 	if (!aio_set_cancel_function(job, t4_aiotx_cancel))
 		panic("new job was cancelled");

Modified: stable/12/sys/dev/cxgbe/tom/t4_ddp.c
==============================================================================
--- stable/12/sys/dev/cxgbe/tom/t4_ddp.c	Sat Jul  6 20:31:37 2019	(r349794)
+++ stable/12/sys/dev/cxgbe/tom/t4_ddp.c	Sun Jul  7 00:30:20 2019	(r349795)
@@ -220,7 +220,7 @@ release_ddp_resources(struct toepcb *toep)
 	int i;
 
 	DDP_LOCK(toep);
-	toep->flags |= DDP_DEAD;
+	toep->ddp.flags |= DDP_DEAD;
 	for (i = 0; i < nitems(toep->ddp.db); i++) {
 		free_ddp_buffer(toep->td, &toep->ddp.db[i]);
 	}
@@ -263,8 +263,8 @@ complete_ddp_buffer(struct toepcb *toep, struct ddp_bu
 		} else
 			toep->ddp.active_id ^= 1;
 #ifdef VERBOSE_TRACES
-		CTR2(KTR_CXGBE, "%s: ddp_active_id = %d", __func__,
-		    toep->ddp.active_id);
+		CTR3(KTR_CXGBE, "%s: tid %u, ddp_active_id = %d", __func__,
+		    toep->tid, toep->ddp.active_id);
 #endif
 	} else {
 		KASSERT(toep->ddp.active_count != 0 &&
@@ -534,8 +534,8 @@ handle_ddp_data(struct toepcb *toep, __be32 ddp_report
 	tp->rcv_wnd -= len;
 #endif
 #ifdef VERBOSE_TRACES
-	CTR4(KTR_CXGBE, "%s: DDP[%d] placed %d bytes (%#x)", __func__, db_idx,
-	    len, report);
+	CTR5(KTR_CXGBE, "%s: tid %u, DDP[%d] placed %d bytes (%#x)", __func__,
+	    toep->tid, db_idx, len, report);
 #endif
 
 	/* receive buffer autosize */
@@ -573,8 +573,9 @@ handle_ddp_data(struct toepcb *toep, __be32 ddp_report
 	} else {
 		copied = job->aio_received;
 #ifdef VERBOSE_TRACES
-		CTR4(KTR_CXGBE, "%s: completing %p (copied %ld, placed %d)",
-		    __func__, job, copied, len);
+		CTR5(KTR_CXGBE,
+		    "%s: tid %u, completing %p (copied %ld, placed %d)",
+		    __func__, toep->tid, job, copied, len);
 #endif
 		aio_complete(job, copied + len, 0);
 		t4_rcvd(&toep->td->tod, tp);
@@ -1791,8 +1792,9 @@ sbcopy:
 	}
 
 #ifdef VERBOSE_TRACES
-	CTR5(KTR_CXGBE, "%s: scheduling %p for DDP[%d] (flags %#lx/%#lx)",
-	    __func__, job, db_idx, ddp_flags, ddp_flags_mask);
+	CTR6(KTR_CXGBE,
+	    "%s: tid %u, scheduling %p for DDP[%d] (flags %#lx/%#lx)", __func__,
+	    toep->tid, job, db_idx, ddp_flags, ddp_flags_mask);
 #endif
 	/* Give the chip the go-ahead. */
 	t4_wrq_tx(sc, wr);
@@ -1918,7 +1920,7 @@ t4_aio_queue_ddp(struct socket *so, struct kaiocb *job
 	 */
 
 #ifdef VERBOSE_TRACES
-	CTR2(KTR_CXGBE, "%s: queueing %p", __func__, job);
+	CTR3(KTR_CXGBE, "%s: queueing %p for tid %u", __func__, job, toep->tid);
 #endif
 	if (!aio_set_cancel_function(job, t4_aio_cancel_queued))
 		panic("new job was cancelled");

Modified: stable/12/sys/dev/cxgbe/tom/t4_tom.c
==============================================================================
--- stable/12/sys/dev/cxgbe/tom/t4_tom.c	Sat Jul  6 20:31:37 2019	(r349794)
+++ stable/12/sys/dev/cxgbe/tom/t4_tom.c	Sun Jul  7 00:30:20 2019	(r349795)
@@ -294,6 +294,7 @@ release_offload_resources(struct toepcb *toep)
 	if (toep->ulp_mode == ULP_MODE_TCPDDP)
 		ddp_assert_empty(toep);
 #endif
+	MPASS(TAILQ_EMPTY(&toep->aiotx_jobq));
 
 	if (toep->l2te)
 		t4_l2t_release(toep->l2te);


More information about the svn-src-stable-12 mailing list