The branch main has been updated by vmaffione:

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

commit 98399ab06f6c6adbd795266bc8a45e3f804ac6f8
Author:     Vincenzo Maffione <vmaffi...@freebsd.org>
AuthorDate: 2021-08-22 09:31:05 +0000
Commit:     Vincenzo Maffione <vmaffi...@freebsd.org>
CommitDate: 2021-08-22 09:31:05 +0000

    netmap: import changes from upstream
    
     - make sure rings are disabled during resets
     - introduce netmap_update_hostrings_mode(), with support
       for multiple host rings
     - always initialize ni_bufs_head in netmap_if
          ni_bufs_head was not properly initialized when no external buffers 
were
          requestedx and contained the ni_bufs_head from the last request. This
          was causing spurious buffer frees when alternating between apps that
          used external buffers and apps that did not use them.
     - check na validitity under lock on detach
     - netmap_mem: fix leak on error path
     - nm_dispatch: fix compilation on Raspberry Pi
    
    MFC after:      2 weeks
---
 sys/dev/netmap/netmap.c      | 36 +++++++++++++++++++++++++++++++-----
 sys/dev/netmap/netmap_kern.h | 10 ----------
 sys/dev/netmap/netmap_mem2.c |  7 ++++---
 sys/net/netmap_user.h        |  2 +-
 4 files changed, 36 insertions(+), 19 deletions(-)

diff --git a/sys/dev/netmap/netmap.c b/sys/dev/netmap/netmap.c
index 9f1edb246cae..ed3154a524db 100644
--- a/sys/dev/netmap/netmap.c
+++ b/sys/dev/netmap/netmap.c
@@ -1002,6 +1002,22 @@ netmap_mem_drop(struct netmap_adapter *na)
        }
 }
 
+static void
+netmap_update_hostrings_mode(struct netmap_adapter *na)
+{
+       enum txrx t;
+       struct netmap_kring *kring;
+       int i;
+
+       for_rx_tx(t) {
+               for (i = nma_get_nrings(na, t);
+                    i < netmap_real_rings(na, t); i++) {
+                       kring = NMR(na, t)[i];
+                       kring->nr_mode = kring->nr_pending_mode;
+               }
+       }
+}
+
 /*
  * Undo everything that was done in netmap_do_regif(). In particular,
  * call nm_register(ifp,0) to stop netmap mode on the interface and
@@ -1032,7 +1048,9 @@ netmap_do_unregif(struct netmap_priv_d *priv)
 #endif
 
        if (na->active_fds <= 0 || nm_kring_pending(priv)) {
+               netmap_set_all_rings(na, NM_KR_LOCKED);
                na->nm_register(na, 0);
+               netmap_set_all_rings(na, 0);
        }
 
        /* delete rings and buffers that are no longer needed */
@@ -2630,7 +2648,9 @@ netmap_do_regif(struct netmap_priv_d *priv, struct 
netmap_adapter *na,
        if (nm_kring_pending(priv)) {
                /* Some kring is switching mode, tell the adapter to
                 * react on this. */
+               netmap_set_all_rings(na, NM_KR_LOCKED);
                error = na->nm_register(na, 1);
+               netmap_set_all_rings(na, 0);
                if (error)
                        goto err_del_if;
        }
@@ -2858,6 +2878,8 @@ netmap_ioctl(struct netmap_priv_d *priv, u_long cmd, 
caddr_t data,
                                                &nifp->ni_bufs_head, 
req->nr_extra_bufs);
                                        if (netmap_verbose)
                                                nm_prinf("got %d extra 
buffers", req->nr_extra_bufs);
+                               } else {
+                                       nifp->ni_bufs_head = 0;
                                }
                                req->nr_offset = 
netmap_mem_if_offset(na->nm_mem, nifp);
 
@@ -4178,12 +4200,16 @@ netmap_hw_krings_create(struct netmap_adapter *na)
 void
 netmap_detach(struct ifnet *ifp)
 {
-       struct netmap_adapter *na = NA(ifp);
+       struct netmap_adapter *na;
 
-       if (!na)
+       NMG_LOCK();
+
+       if (!NM_NA_VALID(ifp)) {
+               NMG_UNLOCK();
                return;
+       }
 
-       NMG_LOCK();
+       na = NA(ifp);
        netmap_set_all_rings(na, NM_KR_LOCKED);
        /*
         * if the netmap adapter is not native, somebody
@@ -4491,7 +4517,7 @@ nm_set_native_flags(struct netmap_adapter *na)
 
        na->na_flags |= NAF_NETMAP_ON;
        nm_os_onenter(ifp);
-       nm_update_hostrings_mode(na);
+       netmap_update_hostrings_mode(na);
 }
 
 void
@@ -4505,7 +4531,7 @@ nm_clear_native_flags(struct netmap_adapter *na)
                return;
        }
 
-       nm_update_hostrings_mode(na);
+       netmap_update_hostrings_mode(na);
        nm_os_onexit(ifp);
 
        na->na_flags &= ~NAF_NETMAP_ON;
diff --git a/sys/dev/netmap/netmap_kern.h b/sys/dev/netmap/netmap_kern.h
index cc452657d8d5..5d8957241c21 100644
--- a/sys/dev/netmap/netmap_kern.h
+++ b/sys/dev/netmap/netmap_kern.h
@@ -1435,16 +1435,6 @@ nm_iszombie(struct netmap_adapter *na)
        return na == NULL || (na->na_flags & NAF_ZOMBIE);
 }
 
-static inline void
-nm_update_hostrings_mode(struct netmap_adapter *na)
-{
-       /* Process nr_mode and nr_pending_mode for host rings. */
-       na->tx_rings[na->num_tx_rings]->nr_mode =
-               na->tx_rings[na->num_tx_rings]->nr_pending_mode;
-       na->rx_rings[na->num_rx_rings]->nr_mode =
-               na->rx_rings[na->num_rx_rings]->nr_pending_mode;
-}
-
 void nm_set_native_flags(struct netmap_adapter *);
 void nm_clear_native_flags(struct netmap_adapter *);
 
diff --git a/sys/dev/netmap/netmap_mem2.c b/sys/dev/netmap/netmap_mem2.c
index e6c83efe9ea9..a6be490e5b09 100644
--- a/sys/dev/netmap/netmap_mem2.c
+++ b/sys/dev/netmap/netmap_mem2.c
@@ -1706,7 +1706,7 @@ _netmap_mem_private_new(size_t size, struct 
netmap_obj_params *p, int grp_id,
                        if (memtotal < poolsz) {
                                nm_prerr("%s: request too large", 
d->pools[i].name);
                                err = ENOMEM;
-                               goto error;
+                               goto error_rel_id;
                        }
                        memtotal -= poolsz;
                }
@@ -1731,14 +1731,15 @@ _netmap_mem_private_new(size_t size, struct 
netmap_obj_params *p, int grp_id,
 
        err = netmap_mem_config(d);
        if (err)
-               goto error_rel_id;
+               goto error_destroy_lock;
 
        d->flags &= ~NETMAP_MEM_FINALIZED;
 
        return d;
 
-error_rel_id:
+error_destroy_lock:
        NMA_LOCK_DESTROY(d);
+error_rel_id:
        nm_mem_release_id(d);
 error_free:
        nm_os_free(d);
diff --git a/sys/net/netmap_user.h b/sys/net/netmap_user.h
index 06b159d9bfe7..e17d2dcbe357 100644
--- a/sys/net/netmap_user.h
+++ b/sys/net/netmap_user.h
@@ -1131,7 +1131,7 @@ nm_dispatch(struct nm_desc *d, int cnt, nm_cb_t cb, 
u_char *arg)
                                slot = &ring->slot[i];
                                d->hdr.len += slot->len;
                                nbuf = (u_char *)NETMAP_BUF(ring, 
slot->buf_idx);
-                               if (oldbuf != NULL && nbuf - oldbuf == 
ring->nr_buf_size &&
+                               if (oldbuf != NULL && (uint32_t)(nbuf - oldbuf) 
== ring->nr_buf_size &&
                                                oldlen == ring->nr_buf_size) {
                                        d->hdr.caplen += slot->len;
                                        oldbuf = nbuf;
_______________________________________________
dev-commits-src-main@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/dev-commits-src-main
To unsubscribe, send any mail to "dev-commits-src-main-unsubscr...@freebsd.org"

Reply via email to