Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 29 Apr 2015 17:48:26 +0000 (UTC)
From:      John Baldwin <jhb@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r282241 - head/sys/dev/virtio/network
Message-ID:  <201504291748.t3THmQkT035346@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jhb
Date: Wed Apr 29 17:48:25 2015
New Revision: 282241
URL: https://svnweb.freebsd.org/changeset/base/282241

Log:
  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.
  
  Differential Revision:	https://reviews.freebsd.org/D2348
  Reviewed by:	adrian, bryanv, luigi
  MFC after:	1 week
  Sponsored by:	Norse Corp, Inc.

Modified:
  head/sys/dev/virtio/network/if_vtnet.c

Modified: head/sys/dev/virtio/network/if_vtnet.c
==============================================================================
--- head/sys/dev/virtio/network/if_vtnet.c	Wed Apr 29 17:19:55 2015	(r282240)
+++ head/sys/dev/virtio/network/if_vtnet.c	Wed Apr 29 17:48:25 2015	(r282241)
@@ -2745,6 +2745,11 @@ vtnet_drain_rxtx_queues(struct vtnet_sof
 	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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201504291748.t3THmQkT035346>