socsvn commit: r306423 - soc2016/vincenzo/head/sys/dev/netmap

vincenzo at FreeBSD.org vincenzo at FreeBSD.org
Mon Jul 18 09:09:49 UTC 2016


Author: vincenzo
Date: Mon Jul 18 09:09:48 2016
New Revision: 306423
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=306423

Log:
   freebsd: ptnet: add periodic timer to accumulate statistics

Modified:
  soc2016/vincenzo/head/sys/dev/netmap/if_ptnet.c

Modified: soc2016/vincenzo/head/sys/dev/netmap/if_ptnet.c
==============================================================================
--- soc2016/vincenzo/head/sys/dev/netmap/if_ptnet.c	Mon Jul 18 09:09:39 2016	(r306422)
+++ soc2016/vincenzo/head/sys/dev/netmap/if_ptnet.c	Mon Jul 18 09:09:48 2016	(r306423)
@@ -153,6 +153,8 @@
 	struct netmap_pt_guest_adapter ptna_dr;
 	/* XXX we should move ptna_dr and backend_regifs inside struct
 	 * netmap_pt_guest_adapter and have just one instance of that. */
+
+	struct callout		tick;
 };
 
 #define PTNET_CORE_LOCK(_sc)	mtx_lock(&(_sc)->lock)
@@ -178,6 +180,7 @@
 
 static int	ptnet_media_change(struct ifnet *ifp);
 static void	ptnet_media_status(struct ifnet *ifp, struct ifmediareq *ifmr);
+static void	ptnet_tick(void *opaque);
 
 static int	ptnet_irqs_init(struct ptnet_softc *sc);
 static void	ptnet_irqs_fini(struct ptnet_softc *sc);
@@ -421,6 +424,7 @@
 	snprintf(sc->lock_name, sizeof(sc->lock_name),
 		 "%s", device_get_nameunit(dev));
 	mtx_init(&sc->lock, sc->lock_name, "ptnet core lock", MTX_DEF);
+	callout_init_mtx(&sc->tick, &sc->lock, 0);
 
 	sc->backend_regifs = 0;
 
@@ -483,6 +487,8 @@
 		ether_poll_deregister(sc->ifp);
 	}
 #endif
+	callout_drain(&sc->tick);
+
 	if (sc->queues) {
 		/* Drain taskqueues before calling if_detach. */
 		for (i = 0; i < sc->num_rings; i++) {
@@ -887,6 +893,8 @@
 	device_printf(sc->dev, "%s: min_tx_space = %u\n", __func__,
 		      sc->min_tx_space);
 
+	callout_reset(&sc->tick, hz, ptnet_tick, sc);
+
 	ifp->if_drv_flags |= IFF_DRV_RUNNING;
 
 	return 0;
@@ -921,6 +929,7 @@
 	 * so that after this loop we are sure nobody is working anymore with
 	 * the device. This scheme is taken from the vtnet driver. */
 	ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
+	callout_stop(&sc->tick);
 	for (i = 0; i < sc->num_rings; i++) {
 		PTNET_Q_LOCK(sc->queues + i);
 		PTNET_Q_UNLOCK(sc->queues + i);
@@ -973,6 +982,16 @@
 	return 0;
 }
 
+/* Called under core lock. */
+static void
+ptnet_tick(void *opaque)
+{
+	struct ptnet_softc *sc = opaque;
+	struct ifnet *ifp = sc->ifp;
+
+	(void)ifp;
+	callout_schedule(&sc->tick, hz);
+}
 
 static void
 ptnet_media_status(struct ifnet *ifp, struct ifmediareq *ifmr)


More information about the svn-soc-all mailing list