diff options
| author | Luigi Rizzo <luigi@FreeBSD.org> | 2015-07-10 05:51:36 +0000 |
|---|---|---|
| committer | Luigi Rizzo <luigi@FreeBSD.org> | 2015-07-10 05:51:36 +0000 |
| commit | 847bf38369b6ea5abf8b6409006468cfe4f66d5e (patch) | |
| tree | 2a938ad28f8fa79c60e58c3430a4c2c93631db94 /sys/dev/netmap/netmap_generic.c | |
| parent | 9d73ee0f82b756db5e53a32e55766db958d41dba (diff) | |
Notes
Diffstat (limited to 'sys/dev/netmap/netmap_generic.c')
| -rw-r--r-- | sys/dev/netmap/netmap_generic.c | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/sys/dev/netmap/netmap_generic.c b/sys/dev/netmap/netmap_generic.c index ecdb36824077..bc5b452cfaae 100644 --- a/sys/dev/netmap/netmap_generic.c +++ b/sys/dev/netmap/netmap_generic.c @@ -305,7 +305,7 @@ generic_netmap_register(struct netmap_adapter *na, int enable) } rtnl_lock(); /* Prepare to intercept incoming traffic. */ - error = netmap_catch_rx(na, 1); + error = netmap_catch_rx(gna, 1); if (error) { D("netdev_rx_handler_register() failed (%d)", error); goto register_handler; @@ -342,7 +342,7 @@ generic_netmap_register(struct netmap_adapter *na, int enable) netmap_catch_tx(gna, 0); /* Do not intercept packets on the rx path. */ - netmap_catch_rx(na, 0); + netmap_catch_rx(gna, 0); rtnl_unlock(); @@ -645,8 +645,6 @@ generic_netmap_txsync(struct netmap_kring *kring, int flags) generic_netmap_tx_clean(kring); - nm_txsync_finalize(kring); - return 0; } @@ -711,7 +709,7 @@ generic_netmap_rxsync(struct netmap_kring *kring, int flags) u_int nm_i; /* index into the netmap ring */ //j, u_int n; u_int const lim = kring->nkr_num_slots - 1; - u_int const head = nm_rxsync_prologue(kring); + u_int const head = kring->rhead; int force_update = (flags & NAF_FORCE_READ) || kring->nr_kflags & NKR_PENDINTR; if (head > lim) @@ -774,8 +772,6 @@ generic_netmap_rxsync(struct netmap_kring *kring, int flags) } kring->nr_hwcur = head; } - /* tell userspace that there might be new packets. */ - nm_rxsync_finalize(kring); IFRATE(rate_ctx.new.rxsync++); return 0; @@ -784,20 +780,25 @@ generic_netmap_rxsync(struct netmap_kring *kring, int flags) static void generic_netmap_dtor(struct netmap_adapter *na) { - struct ifnet *ifp = na->ifp; struct netmap_generic_adapter *gna = (struct netmap_generic_adapter*)na; + struct ifnet *ifp = netmap_generic_getifp(gna); struct netmap_adapter *prev_na = gna->prev; if (prev_na != NULL) { D("Released generic NA %p", gna); - if_rele(na->ifp); + if_rele(ifp); netmap_adapter_put(prev_na); + if (na->ifp == NULL) { + /* + * The driver has been removed without releasing + * the reference so we need to do it here. + */ + netmap_adapter_put(prev_na); + } } - if (ifp != NULL) { - WNA(ifp) = prev_na; - D("Restored native NA %p", prev_na); - na->ifp = NULL; - } + WNA(ifp) = prev_na; + D("Restored native NA %p", prev_na); + na->ifp = NULL; } /* @@ -834,6 +835,7 @@ generic_netmap_attach(struct ifnet *ifp) return ENOMEM; } na = (struct netmap_adapter *)gna; + strncpy(na->name, ifp->if_xname, sizeof(na->name)); na->ifp = ifp; na->num_tx_desc = num_tx_desc; na->num_rx_desc = num_rx_desc; |
