diff options
| author | Luiz Otavio O Souza <loos@FreeBSD.org> | 2017-06-12 22:53:18 +0000 |
|---|---|---|
| committer | Luiz Otavio O Souza <loos@FreeBSD.org> | 2017-06-12 22:53:18 +0000 |
| commit | c3e9b4db8c059c049a20c15d337100a18051f780 (patch) | |
| tree | 8fcdbddd29c4121bbfcbedff06f83250a208fbee /sys/dev/netmap/netmap_generic.c | |
| parent | 965ee74955c3f27a4595c98c3f05c48b204b5c0a (diff) | |
Notes
Diffstat (limited to 'sys/dev/netmap/netmap_generic.c')
| -rw-r--r-- | sys/dev/netmap/netmap_generic.c | 69 |
1 files changed, 34 insertions, 35 deletions
diff --git a/sys/dev/netmap/netmap_generic.c b/sys/dev/netmap/netmap_generic.c index 45dc99184987e..aea1b61096260 100644 --- a/sys/dev/netmap/netmap_generic.c +++ b/sys/dev/netmap/netmap_generic.c @@ -109,13 +109,10 @@ __FBSDID("$FreeBSD$"); * chain into uma_zfree(zone_pack, mf) * (or reinstall the buffer ?) */ -static inline void -set_mbuf_destructor(struct mbuf *m, void *fn) -{ - - m->m_ext.ext_free = fn; - m->m_ext.ext_type = EXT_EXTREF; -} +#define SET_MBUF_DESTRUCTOR(m, fn) do { \ + (m)->m_ext.ext_free = (void *)fn; \ + (m)->m_ext.ext_type = EXT_EXTREF; \ +} while (0) static int void_mbuf_dtor(struct mbuf *m, void *arg1, void *arg2) @@ -170,12 +167,10 @@ nm_os_get_mbuf(struct ifnet *ifp, int len) static void void_mbuf_dtor(struct mbuf *m, void *arg1, void *arg2) { } -static inline void -set_mbuf_destructor(struct mbuf *m, void *fn) -{ - - m->m_ext.ext_free = (fn != NULL) ? fn : (void *)void_mbuf_dtor; -} +#define SET_MBUF_DESTRUCTOR(m, fn) do { \ + (m)->m_ext.ext_free = (fn != NULL) ? \ + (void *)fn : (void *)void_mbuf_dtor; \ +} while (0) static inline struct mbuf * nm_os_get_mbuf(struct ifnet *ifp, int len) @@ -311,7 +306,7 @@ void generic_rate(int txp, int txs, int txi, int rxp, int rxs, int rxi) #endif /* !RATE */ -/* =============== GENERIC NETMAP ADAPTER SUPPORT ================= */ +/* ========== GENERIC (EMULATED) NETMAP ADAPTER SUPPORT ============= */ /* * Wrapper used by the generic adapter layer to notify @@ -341,7 +336,6 @@ generic_netmap_unregister(struct netmap_adapter *na) int i, r; if (na->active_fds == 0) { - D("Generic adapter %p goes off", na); rtnl_lock(); na->na_flags &= ~NAF_NETMAP_ON; @@ -357,14 +351,14 @@ generic_netmap_unregister(struct netmap_adapter *na) for_each_rx_kring_h(r, kring, na) { if (nm_kring_pending_off(kring)) { - D("RX ring %d of generic adapter %p goes off", r, na); + D("Emulated adapter: ring '%s' deactivated", kring->name); kring->nr_mode = NKR_NETMAP_OFF; } } for_each_tx_kring_h(r, kring, na) { if (nm_kring_pending_off(kring)) { kring->nr_mode = NKR_NETMAP_OFF; - D("TX ring %d of generic adapter %p goes off", r, na); + D("Emulated adapter: ring '%s' deactivated", kring->name); } } @@ -387,14 +381,14 @@ generic_netmap_unregister(struct netmap_adapter *na) * TX event is consumed. */ mtx_lock_spin(&kring->tx_event_lock); if (kring->tx_event) { - set_mbuf_destructor(kring->tx_event, NULL); + SET_MBUF_DESTRUCTOR(kring->tx_event, NULL); } kring->tx_event = NULL; mtx_unlock_spin(&kring->tx_event_lock); } if (na->active_fds == 0) { - free(gna->mit, M_DEVBUF); + nm_os_free(gna->mit); for_each_rx_kring(r, kring, na) { mbq_safe_fini(&kring->rx_queue); @@ -411,7 +405,7 @@ generic_netmap_unregister(struct netmap_adapter *na) m_freem(kring->tx_pool[i]); } } - free(kring->tx_pool, M_DEVBUF); + nm_os_free(kring->tx_pool); kring->tx_pool = NULL; } @@ -421,6 +415,7 @@ generic_netmap_unregister(struct netmap_adapter *na) del_timer(&rate_ctx.timer); } #endif + D("Emulated adapter for %s deactivated", na->name); } return 0; @@ -445,13 +440,12 @@ generic_netmap_register(struct netmap_adapter *na, int enable) } if (na->active_fds == 0) { - D("Generic adapter %p goes on", na); + D("Emulated adapter for %s activated", na->name); /* Do all memory allocations when (na->active_fds == 0), to * simplify error management. */ /* Allocate memory for mitigation support on all the rx queues. */ - gna->mit = malloc(na->num_rx_rings * sizeof(struct nm_generic_mit), - M_DEVBUF, M_NOWAIT | M_ZERO); + gna->mit = nm_os_malloc(na->num_rx_rings * sizeof(struct nm_generic_mit)); if (!gna->mit) { D("mitigation allocation failed"); error = ENOMEM; @@ -478,8 +472,7 @@ generic_netmap_register(struct netmap_adapter *na, int enable) } for_each_tx_kring(r, kring, na) { kring->tx_pool = - malloc(na->num_tx_desc * sizeof(struct mbuf *), - M_DEVBUF, M_NOWAIT | M_ZERO); + nm_os_malloc(na->num_tx_desc * sizeof(struct mbuf *)); if (!kring->tx_pool) { D("tx_pool allocation failed"); error = ENOMEM; @@ -492,14 +485,14 @@ generic_netmap_register(struct netmap_adapter *na, int enable) for_each_rx_kring_h(r, kring, na) { if (nm_kring_pending_on(kring)) { - D("RX ring %d of generic adapter %p goes on", r, na); + D("Emulated adapter: ring '%s' activated", kring->name); kring->nr_mode = NKR_NETMAP_ON; } } for_each_tx_kring_h(r, kring, na) { if (nm_kring_pending_on(kring)) { - D("TX ring %d of generic adapter %p goes on", r, na); + D("Emulated adapter: ring '%s' activated", kring->name); kring->nr_mode = NKR_NETMAP_ON; } } @@ -560,13 +553,13 @@ free_tx_pools: if (kring->tx_pool == NULL) { continue; } - free(kring->tx_pool, M_DEVBUF); + nm_os_free(kring->tx_pool); kring->tx_pool = NULL; } for_each_rx_kring(r, kring, na) { mbq_safe_fini(&kring->rx_queue); } - free(gna->mit, M_DEVBUF); + nm_os_free(gna->mit); out: return error; @@ -768,7 +761,7 @@ generic_set_tx_event(struct netmap_kring *kring, u_int hwcur) return; } - set_mbuf_destructor(m, generic_mbuf_destructor); + SET_MBUF_DESTRUCTOR(m, generic_mbuf_destructor); kring->tx_event = m; mtx_unlock_spin(&kring->tx_event_lock); @@ -1161,7 +1154,6 @@ generic_netmap_dtor(struct netmap_adapter *na) struct netmap_adapter *prev_na = gna->prev; if (prev_na != NULL) { - D("Released generic NA %p", gna); netmap_adapter_put(prev_na); if (nm_iszombie(na)) { /* @@ -1170,6 +1162,7 @@ generic_netmap_dtor(struct netmap_adapter *na) */ netmap_adapter_put(prev_na); } + D("Native netmap adapter %p restored", prev_na); } NM_ATTACH_NA(ifp, prev_na); /* @@ -1177,7 +1170,13 @@ generic_netmap_dtor(struct netmap_adapter *na) * overrides WNA(ifp) if na->ifp is not NULL. */ na->ifp = NULL; - D("Restored native NA %p", prev_na); + D("Emulated netmap adapter for %s destroyed", na->name); +} + +int +na_is_generic(struct netmap_adapter *na) +{ + return na->nm_register == generic_netmap_register; } /* @@ -1208,7 +1207,7 @@ generic_netmap_attach(struct ifnet *ifp) return EINVAL; } - gna = malloc(sizeof(*gna), M_DEVBUF, M_NOWAIT | M_ZERO); + gna = nm_os_malloc(sizeof(*gna)); if (gna == NULL) { D("no memory on attach, give up"); return ENOMEM; @@ -1237,7 +1236,7 @@ generic_netmap_attach(struct ifnet *ifp) retval = netmap_attach_common(na); if (retval) { - free(gna, M_DEVBUF); + nm_os_free(gna); return retval; } @@ -1249,7 +1248,7 @@ generic_netmap_attach(struct ifnet *ifp) nm_os_generic_set_features(gna); - D("Created generic NA %p (prev %p)", gna, gna->prev); + D("Emulated adapter for %s created (prev was %p)", na->name, gna->prev); return retval; } |
