diff options
| author | Cy Schubert <cy@FreeBSD.org> | 2021-04-17 14:21:12 +0000 |
|---|---|---|
| committer | Cy Schubert <cy@FreeBSD.org> | 2021-04-17 14:21:12 +0000 |
| commit | b51f459a2098622c31ed54f5c1bf0e03efce403b (patch) | |
| tree | ea87030b875d04b71813a8c6a062dd6f6c9e276b /sys/dev/netmap | |
| parent | 13c4641188d4f012644c39c34499d96a5bbe50af (diff) | |
| parent | efec8223892b3e677acb46eae84ec3534989971f (diff) | |
Diffstat (limited to 'sys/dev/netmap')
| -rw-r--r-- | sys/dev/netmap/netmap.c | 32 | ||||
| -rw-r--r-- | sys/dev/netmap/netmap_kern.h | 10 |
2 files changed, 12 insertions, 30 deletions
diff --git a/sys/dev/netmap/netmap.c b/sys/dev/netmap/netmap.c index 13c412f3ba5b..4835c47d2785 100644 --- a/sys/dev/netmap/netmap.c +++ b/sys/dev/netmap/netmap.c @@ -1002,22 +1002,6 @@ 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 @@ -1047,12 +1031,8 @@ netmap_do_unregif(struct netmap_priv_d *priv) } #endif - netmap_update_hostrings_mode(na); - 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 */ @@ -2629,17 +2609,10 @@ netmap_do_regif(struct netmap_priv_d *priv, struct netmap_adapter *na, goto err_rel_excl; } - /* make sure we don't call na->nm_register() when only - * host rings are changing mode - */ - netmap_update_hostrings_mode(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; } @@ -2661,7 +2634,6 @@ err_del_if: netmap_mem_if_delete(na, nifp); err_rel_excl: netmap_krings_put(priv); - netmap_update_hostrings_mode(na); netmap_mem_rings_delete(na); err_del_krings: if (na->active_fds == 0) @@ -2868,8 +2840,6 @@ 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); @@ -4503,6 +4473,7 @@ nm_set_native_flags(struct netmap_adapter *na) na->na_flags |= NAF_NETMAP_ON; nm_os_onenter(ifp); + nm_update_hostrings_mode(na); } void @@ -4516,6 +4487,7 @@ nm_clear_native_flags(struct netmap_adapter *na) return; } + nm_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 5d8957241c21..cc452657d8d5 100644 --- a/sys/dev/netmap/netmap_kern.h +++ b/sys/dev/netmap/netmap_kern.h @@ -1435,6 +1435,16 @@ 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 *); |
