aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/netmap/netmap_generic.c
diff options
context:
space:
mode:
authorLuiz Otavio O Souza <loos@FreeBSD.org>2017-06-12 22:53:18 +0000
committerLuiz Otavio O Souza <loos@FreeBSD.org>2017-06-12 22:53:18 +0000
commitc3e9b4db8c059c049a20c15d337100a18051f780 (patch)
tree8fcdbddd29c4121bbfcbedff06f83250a208fbee /sys/dev/netmap/netmap_generic.c
parent965ee74955c3f27a4595c98c3f05c48b204b5c0a (diff)
Notes
Diffstat (limited to 'sys/dev/netmap/netmap_generic.c')
-rw-r--r--sys/dev/netmap/netmap_generic.c69
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;
}