svn commit: r185508 - head/sys/dev/cxgb

Kip Macy kmacy at FreeBSD.org
Sun Nov 30 21:43:31 PST 2008


Author: kmacy
Date: Mon Dec  1 05:43:30 2008
New Revision: 185508
URL: http://svn.freebsd.org/changeset/base/185508

Log:
  Update internal mac stats every time the tick task is called
  if we don't do this "netstat -w 1" will frequently see negative
  differences in packets sent

Modified:
  head/sys/dev/cxgb/cxgb_main.c

Modified: head/sys/dev/cxgb/cxgb_main.c
==============================================================================
--- head/sys/dev/cxgb/cxgb_main.c	Mon Dec  1 04:42:39 2008	(r185507)
+++ head/sys/dev/cxgb/cxgb_main.c	Mon Dec  1 05:43:30 2008	(r185508)
@@ -2185,7 +2185,7 @@ cxgb_tick(void *arg)
 	if(sc->flags & CXGB_SHUTDOWN)
 		return;
 
-	taskqueue_enqueue(sc->tq, &sc->tick_task);
+	taskqueue_enqueue(sc->tq, &sc->tick_task);	
 	callout_reset(&sc->cxgb_tick_ch, CXGB_TICKS(sc), cxgb_tick, sc);
 }
 
@@ -2204,10 +2204,25 @@ cxgb_tick_handler(void *arg, int count)
 		check_link_status(sc);
 
 	
+	sc->check_task_cnt++;
+
+	/*
+	 * adapter lock can currently only be acquired after the
+	 * port lock
+	 */
+	ADAPTER_UNLOCK(sc);
+
+	if (p->rev == T3_REV_B2 && p->nports < 4 && sc->open_device_map) 
+		check_t3b2_mac(sc);
+
 	for (i = 0; i < sc->params.nports; i++) {
 		struct port_info *pi = &sc->port[i];
 		struct ifnet *ifp = pi->ifp;
 		struct mac_stats *mstats = &pi->mac.stats;
+		PORT_LOCK(pi);
+		t3_mac_update_stats(&pi->mac);
+		PORT_UNLOCK(pi);
+
 		
 		ifp->if_opackets =
 		    mstats->tx_frames_64 +
@@ -2254,30 +2269,6 @@ cxgb_tick_handler(void *arg, int count)
 		    mstats->rx_short +
 		    mstats->rx_fcs_errs;
 	}
-		
-	sc->check_task_cnt++;
-
-	/*
-	 * adapter lock can currently only be acquired after the
-	 * port lock
-	 */
-	ADAPTER_UNLOCK(sc);
-
-	if (p->rev == T3_REV_B2 && p->nports < 4 && sc->open_device_map) 
-		check_t3b2_mac(sc);
-
-	/* Update MAC stats if it's time to do so */
-	if (!p->linkpoll_period ||
-	    (sc->check_task_cnt * p->linkpoll_period) / 10 >=
-	    p->stats_update_period) {
-		for_each_port(sc, i) {
-			struct port_info *port = &sc->port[i];
-			PORT_LOCK(port);
-			t3_mac_update_stats(&port->mac);
-			PORT_UNLOCK(port);
-		}
-		sc->check_task_cnt = 0;
-	}
 }
 
 static void


More information about the svn-src-all mailing list