summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2015-05-27 14:29:39 +0000
committerjhb <jhb@FreeBSD.org>2015-05-27 14:29:39 +0000
commit38c6ad8c69b6e6ab7fd5b8a9089fa30ea3855bed (patch)
tree7a4f0a6b1845ae8100d4458047f63018aa569e7f
parent1f42ff868ac506ba941c51b42ea286b30e31add8 (diff)
downloadFreeBSD-src-38c6ad8c69b6e6ab7fd5b8a9089fa30ea3855bed.zip
FreeBSD-src-38c6ad8c69b6e6ab7fd5b8a9089fa30ea3855bed.tar.gz
MFC 282241:
Don't free mbufs when stopping an interface in netmap mode. Currently if you ifconfig down a vtnet interface while it is being used via netmap, the kernel panics due to trying to treat the cookie values in the virtio rings as mbufs to be freed. When netmap is enabled, these cookie values are pointers to something else. Note that other netmap-aware drivers don't seem to need this as they store the mbuf pointers in the software rings that mirror the hardware descriptor rings, and since netmap doesn't touch those, the software state always has NULL mbuf pointers causing the loops to free mbufs to not do anything. However, vtnet reuses the same state area for both netmap and non-netmap mode, so it needs to explicitly avoid looking at the rings and treating the cookie values as mbufs if netmap is enabled. Sponsored by: Norse Corp, Inc.
-rw-r--r--sys/dev/virtio/network/if_vtnet.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/sys/dev/virtio/network/if_vtnet.c b/sys/dev/virtio/network/if_vtnet.c
index 42ea98a..8e8c8d7 100644
--- a/sys/dev/virtio/network/if_vtnet.c
+++ b/sys/dev/virtio/network/if_vtnet.c
@@ -2756,6 +2756,11 @@ vtnet_drain_rxtx_queues(struct vtnet_softc *sc)
struct vtnet_txq *txq;
int i;
+#ifdef DEV_NETMAP
+ if (nm_native_on(NA(sc->vtnet_ifp)))
+ return;
+#endif /* DEV_NETMAP */
+
for (i = 0; i < sc->vtnet_act_vq_pairs; i++) {
rxq = &sc->vtnet_rxqs[i];
vtnet_rxq_free_mbufs(rxq);
OpenPOWER on IntegriCloud