svn commit: r272090 - head/sys/dev/mxge

Gleb Smirnoff glebius at FreeBSD.org
Thu Sep 25 05:45:53 UTC 2014


Author: glebius
Date: Thu Sep 25 05:45:52 2014
New Revision: 272090
URL: http://svnweb.freebsd.org/changeset/base/272090

Log:
  - Provide mxge_get_counter() to return counters that are not collected,
    but taken from hardware.
  - Mechanically convert to if_inc_counter() the rest of counters.

Modified:
  head/sys/dev/mxge/if_mxge.c

Modified: head/sys/dev/mxge/if_mxge.c
==============================================================================
--- head/sys/dev/mxge/if_mxge.c	Thu Sep 25 02:26:05 2014	(r272089)
+++ head/sys/dev/mxge/if_mxge.c	Thu Sep 25 05:45:52 2014	(r272090)
@@ -2678,7 +2678,7 @@ mxge_rx_done_big(struct mxge_slice_state
 	/* try to replace the received mbuf */
 	if (mxge_get_buf_big(ss, rx->extra_map, idx)) {
 		/* drop the frame -- the old mbuf is re-cycled */
-		ifp->if_ierrors++;
+		if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
 		return;
 	}
 
@@ -2747,7 +2747,7 @@ mxge_rx_done_small(struct mxge_slice_sta
 	/* try to replace the received mbuf */
 	if (mxge_get_buf_small(ss, rx->extra_map, idx)) {
 		/* drop the frame -- the old mbuf is re-cycled */
-		ifp->if_ierrors++;
+		if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
 		return;
 	}
 
@@ -4036,43 +4036,45 @@ mxge_watchdog(mxge_softc_t *sc)
 	return (err);
 }
 
-static u_long
-mxge_update_stats(mxge_softc_t *sc)
+static uint64_t
+mxge_get_counter(struct ifnet *ifp, ift_counter cnt)
 {
-	struct mxge_slice_state *ss;
-	u_long pkts = 0;
-	u_long ipackets = 0;
-	u_long opackets = 0;
-#ifdef IFNET_BUF_RING
-	u_long obytes = 0;
-	u_long omcasts = 0;
-	u_long odrops = 0;
-#endif
-	u_long oerrors = 0;
-	int slice;
+	struct mxge_softc *sc;
+	uint64_t rv;
 
-	for (slice = 0; slice < sc->num_slices; slice++) {
-		ss = &sc->ss[slice];
-		ipackets += ss->ipackets;
-		opackets += ss->opackets;
-#ifdef IFNET_BUF_RING
-		obytes += ss->obytes;
-		omcasts += ss->omcasts;
-		odrops += ss->tx.br->br_drops;
-#endif
-		oerrors += ss->oerrors;
-	}
-	pkts = (ipackets - sc->ifp->if_ipackets);
-	pkts += (opackets - sc->ifp->if_opackets);
-	sc->ifp->if_ipackets = ipackets;
-	sc->ifp->if_opackets = opackets;
+	sc = if_getsoftc(ifp);
+	rv = 0;
+
+	switch (cnt) {
+	case IFCOUNTER_IPACKETS:
+		for (int s = 0; s < sc->num_slices; s++)
+			rv += sc->ss[s].ipackets;
+		return (rv);
+	case IFCOUNTER_OPACKETS:
+		for (int s = 0; s < sc->num_slices; s++)
+			rv += sc->ss[s].opackets;
+		return (rv);
+	case IFCOUNTER_OERRORS:
+		for (int s = 0; s < sc->num_slices; s++)
+			rv += sc->ss[s].oerrors;
+		return (rv);
 #ifdef IFNET_BUF_RING
-	sc->ifp->if_obytes = obytes;
-	sc->ifp->if_omcasts = omcasts;
-	sc->ifp->if_oqdrops = odrops;
+	case IFCOUNTER_OBYTES:
+		for (int s = 0; s < sc->num_slices; s++)
+			rv += sc->ss[s].obytes;
+		return (rv);
+	case IFCOUNTER_OMCASTS:
+		for (int s = 0; s < sc->num_slices; s++)
+			rv += sc->ss[s].omcasts;
+		return (rv);
+	case IFCOUNTER_OQDROPS:
+		for (int s = 0; s < sc->num_slices; s++)
+			rv += sc->ss[s].tx.br->br_drops;
+		return (rv);
 #endif
-	sc->ifp->if_oerrors = oerrors;
-	return pkts;
+	default:
+		return (if_get_counter_default(ifp, cnt));
+	}
 }
 
 static void
@@ -4087,8 +4089,6 @@ mxge_tick(void *arg)
 	ticks = mxge_ticks;
 	running = sc->ifp->if_drv_flags & IFF_DRV_RUNNING;
 	if (running) {
-		/* aggregate stats from different slices */
-		pkts = mxge_update_stats(sc);
 		if (!sc->watchdog_countdown) {
 			err = mxge_watchdog(sc);
 			sc->watchdog_countdown = 4;
@@ -4925,6 +4925,7 @@ mxge_attach(device_t dev)
         ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
         ifp->if_ioctl = mxge_ioctl;
         ifp->if_start = mxge_start;
+	ifp->if_get_counter = mxge_get_counter;
 	/* Initialise the ifmedia structure */
 	ifmedia_init(&sc->media, 0, mxge_media_change, 
 		     mxge_media_status);


More information about the svn-src-all mailing list