The branch main has been updated by np:

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

commit c341048373ac6d4bad6dccc63880ff3f326ba15f
Author:     John Baldwin <[email protected]>
AuthorDate: 2025-09-29 14:50:34 +0000
Commit:     Navdeep Parhar <[email protected]>
CommitDate: 2025-09-29 15:19:11 +0000

    cxgbe: Refactor find_offload_adapter and move to t4_tom from cxgbei
    
    This allows it to be used for other offload drivers.
    
    MFC after:      3 days
    Sponsored by:   Chelsio Communications
---
 sys/dev/cxgbe/cxgbei/icl_cxgbei.c | 54 +++------------------------------------
 sys/dev/cxgbe/tom/t4_tom.c        | 48 ++++++++++++++++++++++++++++++++++
 sys/dev/cxgbe/tom/t4_tom.h        |  1 +
 3 files changed, 53 insertions(+), 50 deletions(-)

diff --git a/sys/dev/cxgbe/cxgbei/icl_cxgbei.c 
b/sys/dev/cxgbe/cxgbei/icl_cxgbei.c
index d805642541d3..a79cc58b870c 100644
--- a/sys/dev/cxgbe/cxgbei/icl_cxgbei.c
+++ b/sys/dev/cxgbe/cxgbei/icl_cxgbei.c
@@ -976,42 +976,6 @@ icl_cxgbei_setsockopt(struct icl_conn *ic, struct socket 
*so, int sspace,
        return (0);
 }
 
-/*
- * Request/response structure used to find out the adapter offloading a socket.
- */
-struct find_ofld_adapter_rr {
-       struct socket *so;
-       struct adapter *sc;     /* result */
-};
-
-static void
-find_offload_adapter(struct adapter *sc, void *arg)
-{
-       struct find_ofld_adapter_rr *fa = arg;
-       struct socket *so = fa->so;
-       struct tom_data *td = sc->tom_softc;
-       struct tcpcb *tp;
-       struct inpcb *inp;
-
-       /* Non-TCP were filtered out earlier. */
-       MPASS(so->so_proto->pr_protocol == IPPROTO_TCP);
-
-       if (fa->sc != NULL)
-               return; /* Found already. */
-
-       if (td == NULL)
-               return; /* TOE not enabled on this adapter. */
-
-       inp = sotoinpcb(so);
-       INP_WLOCK(inp);
-       if ((inp->inp_flags & INP_DROPPED) == 0) {
-               tp = intotcpcb(inp);
-               if (tp->t_flags & TF_TOE && tp->tod == &td->tod)
-                       fa->sc = sc;    /* Found. */
-       }
-       INP_WUNLOCK(inp);
-}
-
 static bool
 is_memfree(struct adapter *sc)
 {
@@ -1095,7 +1059,6 @@ int
 icl_cxgbei_conn_handoff(struct icl_conn *ic, int fd)
 {
        struct icl_cxgbei_conn *icc = ic_to_icc(ic);
-       struct find_ofld_adapter_rr fa;
        struct file *fp;
        struct socket *so;
        struct inpcb *inp;
@@ -1139,15 +1102,11 @@ icl_cxgbei_conn_handoff(struct icl_conn *ic, int fd)
        fdrop(fp, curthread);
        ICL_CONN_UNLOCK(ic);
 
-       /* Find the adapter offloading this socket. */
-       fa.sc = NULL;
-       fa.so = so;
-       t4_iterate(find_offload_adapter, &fa);
-       if (fa.sc == NULL) {
+       icc->sc = find_offload_adapter(so);
+       if (icc->sc == NULL) {
                error = EINVAL;
                goto out;
        }
-       icc->sc = fa.sc;
 
        max_rx_pdu_len = ISCSI_BHS_SIZE + ic->ic_max_recv_data_segment_length;
        max_tx_pdu_len = ISCSI_BHS_SIZE + ic->ic_max_send_data_segment_length;
@@ -1778,7 +1737,6 @@ cxgbei_limits(struct adapter *sc, void *arg)
 static int
 cxgbei_limits_fd(struct icl_drv_limits *idl, int fd)
 {
-       struct find_ofld_adapter_rr fa;
        struct file *fp;
        struct socket *so;
        struct adapter *sc;
@@ -1801,17 +1759,13 @@ cxgbei_limits_fd(struct icl_drv_limits *idl, int fd)
                return (EINVAL);
        }
 
-       /* Find the adapter offloading this socket. */
-       fa.sc = NULL;
-       fa.so = so;
-       t4_iterate(find_offload_adapter, &fa);
-       if (fa.sc == NULL) {
+       sc = find_offload_adapter(so);
+       if (sc == NULL) {
                fdrop(fp, curthread);
                return (ENXIO);
        }
        fdrop(fp, curthread);
 
-       sc = fa.sc;
        error = begin_synchronized_op(sc, NULL, HOLD_LOCK, "t4lims");
        if (error != 0)
                return (error);
diff --git a/sys/dev/cxgbe/tom/t4_tom.c b/sys/dev/cxgbe/tom/t4_tom.c
index 18d73afc47c5..f6d3a31667fb 100644
--- a/sys/dev/cxgbe/tom/t4_tom.c
+++ b/sys/dev/cxgbe/tom/t4_tom.c
@@ -2266,6 +2266,54 @@ t4_aio_queue_tom(struct socket *so, struct kaiocb *job)
                return (0);
 }
 
+/*
+ * Request/response structure used to find out the adapter offloading
+ * a socket.
+ */
+struct find_offload_adapter_data {
+       struct socket *so;
+       struct adapter *sc;     /* result */
+};
+
+static void
+find_offload_adapter_cb(struct adapter *sc, void *arg)
+{
+       struct find_offload_adapter_data *fa = arg;
+       struct socket *so = fa->so;
+       struct tom_data *td = sc->tom_softc;
+       struct tcpcb *tp;
+       struct inpcb *inp;
+
+       /* Non-TCP were filtered out earlier. */
+       MPASS(so->so_proto->pr_protocol == IPPROTO_TCP);
+
+       if (fa->sc != NULL)
+               return; /* Found already. */
+
+       if (td == NULL)
+               return; /* TOE not enabled on this adapter. */
+
+       inp = sotoinpcb(so);
+       INP_WLOCK(inp);
+       if ((inp->inp_flags & INP_DROPPED) == 0) {
+               tp = intotcpcb(inp);
+               if (tp->t_flags & TF_TOE && tp->tod == &td->tod)
+                       fa->sc = sc;    /* Found. */
+       }
+       INP_WUNLOCK(inp);
+}
+
+struct adapter *
+find_offload_adapter(struct socket *so)
+{
+       struct find_offload_adapter_data fa;
+
+       fa.sc = NULL;
+       fa.so = so;
+       t4_iterate(find_offload_adapter_cb, &fa);
+       return (fa.sc);
+}
+
 static int
 t4_tom_mod_load(void)
 {
diff --git a/sys/dev/cxgbe/tom/t4_tom.h b/sys/dev/cxgbe/tom/t4_tom.h
index c3eb8578799d..a178c9b7ef5e 100644
--- a/sys/dev/cxgbe/tom/t4_tom.h
+++ b/sys/dev/cxgbe/tom/t4_tom.h
@@ -484,6 +484,7 @@ __be32 calc_options2(struct vi_info *, struct conn_params 
*);
 uint64_t select_ntuple(struct vi_info *, struct l2t_entry *);
 int negative_advice(int);
 int add_tid_to_history(struct adapter *, u_int);
+struct adapter *find_offload_adapter(struct socket *);
 void t4_pcb_detach(struct toedev *, struct tcpcb *);
 
 /* t4_connect.c */

Reply via email to