summaryrefslogtreecommitdiffstats
path: root/sys/dev/netmap/netmap_generic.c
diff options
context:
space:
mode:
authorkaiw <kaiw@FreeBSD.org>2014-01-20 19:38:44 +0000
committerkaiw <kaiw@FreeBSD.org>2014-01-20 19:38:44 +0000
commite9c152dbc2e572c490d3035d77f142253b674ded (patch)
treeae65253d09d5b1583a6bb647cd383e77be00e687 /sys/dev/netmap/netmap_generic.c
parentcb3a8568bd4e3f2bf20a1c342c6957d1a568a5df (diff)
parent681dcc3c572a6831f4cb5f341c90ea4f9278bc81 (diff)
downloadFreeBSD-src-e9c152dbc2e572c490d3035d77f142253b674ded.zip
FreeBSD-src-e9c152dbc2e572c490d3035d77f142253b674ded.tar.gz
MFH@260917.
Diffstat (limited to 'sys/dev/netmap/netmap_generic.c')
-rw-r--r--sys/dev/netmap/netmap_generic.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/sys/dev/netmap/netmap_generic.c b/sys/dev/netmap/netmap_generic.c
index 109a734..e695fcb 100644
--- a/sys/dev/netmap/netmap_generic.c
+++ b/sys/dev/netmap/netmap_generic.c
@@ -261,7 +261,7 @@ generic_netmap_register(struct netmap_adapter *na, int enable)
/* Prepare to intercept incoming traffic. */
error = netmap_catch_rx(na, 1);
if (error) {
- D("netdev_rx_handler_register() failed");
+ D("netdev_rx_handler_register() failed (%d)", error);
goto register_handler;
}
ifp->if_capenable |= IFCAP_NETMAP;
@@ -283,7 +283,11 @@ generic_netmap_register(struct netmap_adapter *na, int enable)
rate_ctx.refcount++;
#endif /* RATE */
- } else { /* Disable netmap mode. */
+ } else if (na->tx_rings[0].tx_pool) {
+ /* Disable netmap mode. We enter here only if the previous
+ generic_netmap_register(na, 1) was successfull.
+ If it was not, na->tx_rings[0].tx_pool was set to NULL by the
+ error handling code below. */
rtnl_lock();
ifp->if_capenable &= ~IFCAP_NETMAP;
@@ -322,7 +326,7 @@ generic_netmap_register(struct netmap_adapter *na, int enable)
#ifdef REG_RESET
error = ifp->netdev_ops->ndo_open(ifp);
if (error) {
- goto alloc_tx_pool;
+ goto free_tx_pools;
}
#endif
@@ -338,6 +342,11 @@ free_tx_pools:
if (na->tx_rings[r].tx_pool[i])
m_freem(na->tx_rings[r].tx_pool[i]);
free(na->tx_rings[r].tx_pool, M_DEVBUF);
+ na->tx_rings[r].tx_pool = NULL;
+ }
+ netmap_mitigation_cleanup(gna);
+ for (r=0; r<na->num_rx_rings; r++) {
+ mbq_safe_destroy(&na->rx_rings[r].rx_queue);
}
return error;
OpenPOWER on IntegriCloud