git: 283333c0e329 - main - cxgbe/t4_tom: Track all synq entries in a per-adapter list.

From: Navdeep Parhar <np_at_FreeBSD.org>
Date: Mon, 22 Jul 2024 04:06:25 UTC
The branch main has been updated by np:

URL: https://cgit.FreeBSD.org/src/commit/?id=283333c0e329fd7aceff16fa3bf2b9892744d883

commit 283333c0e329fd7aceff16fa3bf2b9892744d883
Author:     Navdeep Parhar <np@FreeBSD.org>
AuthorDate: 2024-07-20 19:38:42 +0000
Commit:     Navdeep Parhar <np@FreeBSD.org>
CommitDate: 2024-07-22 04:02:34 +0000

    cxgbe/t4_tom: Track all synq entries in a per-adapter list.
    
    Live tid entries in tid_tab are either full fledged connections or synq
    entries.  toep_list tracks the connections already and this change adds
    a synqe_list to track the synq entries.  These two lists can be used to
    enumerate and iterate over all live tids.
    
    MFC after:      1 week
    Sponsored by:   Chelsio Communications
---
 sys/dev/cxgbe/tom/t4_listen.c | 12 ++++++++++++
 sys/dev/cxgbe/tom/t4_tom.c    |  2 ++
 sys/dev/cxgbe/tom/t4_tom.h    |  2 ++
 3 files changed, 16 insertions(+)

diff --git a/sys/dev/cxgbe/tom/t4_listen.c b/sys/dev/cxgbe/tom/t4_listen.c
index d25c161d3f8d..6e8361734db7 100644
--- a/sys/dev/cxgbe/tom/t4_listen.c
+++ b/sys/dev/cxgbe/tom/t4_listen.c
@@ -849,6 +849,7 @@ do_close_server_rpl(struct sge_iq *iq, const struct rss_header *rss,
 static void
 done_with_synqe(struct adapter *sc, struct synq_entry *synqe)
 {
+	struct tom_data *td = sc->tom_softc;
 	struct listen_ctx *lctx = synqe->lctx;
 	struct inpcb *inp = lctx->inp;
 	struct l2t_entry *e = &sc->l2t->l2tab[synqe->params.l2t_idx];
@@ -858,6 +859,9 @@ done_with_synqe(struct adapter *sc, struct synq_entry *synqe)
 	ntids = inp->inp_vflag & INP_IPV6 ? 2 : 1;
 
 	remove_tid(sc, synqe->tid, ntids);
+	mtx_lock(&td->toep_list_lock);
+	TAILQ_REMOVE(&td->synqe_list, synqe, link);
+	mtx_unlock(&td->toep_list_lock);
 	release_tid(sc, synqe->tid, lctx->ctrlq);
 	t4_l2t_release(e);
 	inp = release_synqe(sc, synqe);
@@ -961,6 +965,7 @@ void
 t4_offload_socket(struct toedev *tod, void *arg, struct socket *so)
 {
 	struct adapter *sc = tod->tod_softc;
+	struct tom_data *td = sc->tom_softc;
 	struct synq_entry *synqe = arg;
 	struct inpcb *inp = sotoinpcb(so);
 	struct toepcb *toep = synqe->toep;
@@ -976,6 +981,9 @@ t4_offload_socket(struct toedev *tod, void *arg, struct socket *so)
 	toep->flags |= TPF_CPL_PENDING;
 	update_tid(sc, synqe->tid, toep);
 	synqe->flags |= TPF_SYNQE_EXPANDED;
+	mtx_lock(&td->toep_list_lock);
+	TAILQ_REMOVE(&td->synqe_list, synqe, link);
+	mtx_unlock(&td->toep_list_lock);
 	inp->inp_flowtype = (inp->inp_vflag & INP_IPV6) ?
 	    M_HASHTYPE_RSS_TCP_IPV6 : M_HASHTYPE_RSS_TCP_IPV4;
 	inp->inp_flowid = synqe->rss_hash;
@@ -1177,6 +1185,7 @@ do_pass_accept_req(struct sge_iq *iq, const struct rss_header *rss,
     struct mbuf *m)
 {
 	struct adapter *sc = iq->adapter;
+	struct tom_data *td = sc->tom_softc;
 	struct toedev *tod;
 	const struct cpl_pass_accept_req *cpl = mtod(m, const void *);
 	unsigned int stid = G_PASS_OPEN_TID(be32toh(cpl->tos_stid));
@@ -1383,6 +1392,9 @@ found:
 			REJECT_PASS_ACCEPT_REQ(true);
 		}
 
+		mtx_lock(&td->toep_list_lock);
+		TAILQ_INSERT_TAIL(&td->synqe_list, synqe, link);
+		mtx_unlock(&td->toep_list_lock);
 		CTR6(KTR_CXGBE,
 		    "%s: stid %u, tid %u, synqe %p, opt0 %#016lx, opt2 %#08x",
 		    __func__, stid, tid, synqe, be64toh(opt0), be32toh(opt2));
diff --git a/sys/dev/cxgbe/tom/t4_tom.c b/sys/dev/cxgbe/tom/t4_tom.c
index f9d8dcd706b7..fb92c88aa358 100644
--- a/sys/dev/cxgbe/tom/t4_tom.c
+++ b/sys/dev/cxgbe/tom/t4_tom.c
@@ -1831,6 +1831,7 @@ t4_tom_activate(struct adapter *sc)
 	/* List of TOE PCBs and associated lock */
 	mtx_init(&td->toep_list_lock, "PCB list lock", NULL, MTX_DEF);
 	TAILQ_INIT(&td->toep_list);
+	TAILQ_INIT(&td->synqe_list);
 
 	/* Listen context */
 	mtx_init(&td->lctx_hash_lock, "lctx hash lock", NULL, MTX_DEF);
@@ -1915,6 +1916,7 @@ t4_tom_deactivate(struct adapter *sc)
 	mtx_lock(&td->toep_list_lock);
 	if (!TAILQ_EMPTY(&td->toep_list))
 		rc = EBUSY;
+	MPASS(TAILQ_EMPTY(&td->synqe_list));
 	mtx_unlock(&td->toep_list_lock);
 
 	mtx_lock(&td->lctx_hash_lock);
diff --git a/sys/dev/cxgbe/tom/t4_tom.h b/sys/dev/cxgbe/tom/t4_tom.h
index fb74642d61f7..0bc368fe3d56 100644
--- a/sys/dev/cxgbe/tom/t4_tom.h
+++ b/sys/dev/cxgbe/tom/t4_tom.h
@@ -269,6 +269,7 @@ struct synq_entry {
 	struct listen_ctx *lctx;	/* backpointer to listen ctx */
 	struct mbuf *syn;
 	int flags;			/* same as toepcb's tp_flags */
+	TAILQ_ENTRY(synq_entry) link;	/* synqe_list */
 	volatile int ok_to_respond;
 	volatile u_int refcnt;
 	int tid;
@@ -329,6 +330,7 @@ struct tom_data {
 	/* toepcb's associated with this TOE device */
 	struct mtx toep_list_lock;
 	TAILQ_HEAD(, toepcb) toep_list;
+	TAILQ_HEAD(, synq_entry) synqe_list;
 
 	struct mtx lctx_hash_lock;
 	LIST_HEAD(, listen_ctx) *listen_hash;