Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 17 Nov 2009 14:13:30 +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: r199378 - head/sys/dev/de
Message-ID:  <200911171413.nAHEDUF6011052@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jhb
Date: Tue Nov 17 14:13:30 2009
New Revision: 199378
URL: http://svn.freebsd.org/changeset/base/199378

Log:
  Use a private timer to run the statistics timer instead of (ab)using
  if_watchdog and if_timer.
  
  Tested by:	WATANABE Kazuhiro  CQG00620 of nifty.ne.jp

Modified:
  head/sys/dev/de/if_de.c
  head/sys/dev/de/if_devar.h

Modified: head/sys/dev/de/if_de.c
==============================================================================
--- head/sys/dev/de/if_de.c	Tue Nov 17 14:08:42 2009	(r199377)
+++ head/sys/dev/de/if_de.c	Tue Nov 17 14:13:30 2009	(r199378)
@@ -151,6 +151,7 @@ static void	tulip_start_locked(tulip_sof
 static struct mbuf *
 		tulip_txput(tulip_softc_t * const sc, struct mbuf *m);
 static void	tulip_txput_setup(tulip_softc_t * const sc);
+static void	tulip_watchdog(void *arg);
 struct mbuf *	tulip_dequeue_mbuf(tulip_ringinfo_t *ri, tulip_descinfo_t *di,
 		    int sync);
 static void	tulip_dma_map_addr(void *, bus_dma_segment_t *, int, int);
@@ -3302,11 +3303,13 @@ tulip_init_locked(tulip_softc_t * const 
 	    TULIP_CSR_READ(sc, csr_status));
 	if ((sc->tulip_flags & (TULIP_WANTSETUP|TULIP_TXPROBE_ACTIVE)) == TULIP_WANTSETUP)
 	    tulip_txput_setup(sc);
+	callout_reset(&sc->tulip_stat_timer, hz, tulip_watchdog, sc);
     } else {
 	CTR0(KTR_TULIP, "tulip_init_locked: not up, reset chip");
 	sc->tulip_ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
 	tulip_reset(sc);
 	tulip_addr_filter(sc);
+	callout_stop(&sc->tulip_stat_timer);
     }
 }
 
@@ -4319,23 +4322,17 @@ tulip_start_locked(tulip_softc_t * const
     }
 }
 
-/*
- * Even though this routine runs at device spl, it does not break
- * our use of splnet (splsoftnet under NetBSD) for the majority
- * of this driver since 
- * if_watcbog is called from if_watchdog which is called from
- * splsoftclock which is below spl[soft]net.
- */
 static void
-tulip_ifwatchdog(struct ifnet *ifp)
+tulip_watchdog(void *arg)
 {
-    TULIP_PERFSTART(ifwatchdog)
-    tulip_softc_t * const sc = (tulip_softc_t *)ifp->if_softc;
+    TULIP_PERFSTART(stat)
+    tulip_softc_t *sc = arg;
 #if defined(TULIP_DEBUG)
     u_int32_t rxintrs;
 #endif
 
-    TULIP_LOCK(sc);
+    TULIP_LOCK_ASSERT(sc);
+    callout_reset(&sc->tulip_stat_timer, hz, tulip_watchdog, sc);    
 #if defined(TULIP_DEBUG)
     rxintrs = sc->tulip_dbg.dbg_rxintrs - sc->tulip_dbg.dbg_last_rxintrs;
     if (rxintrs > sc->tulip_dbg.dbg_high_rxintrs_hz)
@@ -4343,7 +4340,6 @@ tulip_ifwatchdog(struct ifnet *ifp)
     sc->tulip_dbg.dbg_last_rxintrs = sc->tulip_dbg.dbg_rxintrs;
 #endif /* TULIP_DEBUG */
 
-    sc->tulip_ifp->if_timer = 1;
     /*
      * These should be rare so do a bulk test up front so we can just skip
      * them if needed.
@@ -4381,11 +4377,11 @@ tulip_ifwatchdog(struct ifnet *ifp)
 	tulip_init_locked(sc);
     }
 
-    TULIP_PERFEND(ifwatchdog);
+    TULIP_PERFEND(stat);
     TULIP_PERFMERGE(sc, perf_intr_cycles);
     TULIP_PERFMERGE(sc, perf_ifstart_cycles);
     TULIP_PERFMERGE(sc, perf_ifioctl_cycles);
-    TULIP_PERFMERGE(sc, perf_ifwatchdog_cycles);
+    TULIP_PERFMERGE(sc, perf_stat_cycles);
     TULIP_PERFMERGE(sc, perf_timeout_cycles);
     TULIP_PERFMERGE(sc, perf_ifstart_one_cycles);
     TULIP_PERFMERGE(sc, perf_txput_cycles);
@@ -4395,14 +4391,13 @@ tulip_ifwatchdog(struct ifnet *ifp)
     TULIP_PERFMERGE(sc, perf_intr);
     TULIP_PERFMERGE(sc, perf_ifstart);
     TULIP_PERFMERGE(sc, perf_ifioctl);
-    TULIP_PERFMERGE(sc, perf_ifwatchdog);
+    TULIP_PERFMERGE(sc, perf_stat);
     TULIP_PERFMERGE(sc, perf_timeout);
     TULIP_PERFMERGE(sc, perf_ifstart_one);
     TULIP_PERFMERGE(sc, perf_txput);
     TULIP_PERFMERGE(sc, perf_txintr);
     TULIP_PERFMERGE(sc, perf_rxintr);
     TULIP_PERFMERGE(sc, perf_rxget);
-    TULIP_UNLOCK(sc);
 }
 
 static void
@@ -4418,8 +4413,6 @@ tulip_attach(tulip_softc_t * const sc)
     ifp->if_flags = IFF_BROADCAST|IFF_SIMPLEX|IFF_MULTICAST;
     ifp->if_ioctl = tulip_ifioctl;
     ifp->if_start = tulip_start;
-    ifp->if_watchdog = tulip_ifwatchdog;
-    ifp->if_timer = 1;
     ifp->if_init = tulip_init;
     IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen);
     ifp->if_snd.ifq_drv_maxlen = ifqmaxlen;
@@ -4839,6 +4832,7 @@ tulip_pci_attach(device_t dev)
     mtx_init(TULIP_MUTEX(sc), MTX_NETWORK_LOCK, device_get_nameunit(dev),
 	MTX_DEF);
     callout_init_mtx(&sc->tulip_callout, TULIP_MUTEX(sc), 0);
+    callout_init_mtx(&sc->tulip_stat_timer, TULIP_MUTEX(sc), 0);
     tulips[unit] = sc;
 
     tulip_initcsrs(sc, csr_base + csroffset, csrsize);

Modified: head/sys/dev/de/if_devar.h
==============================================================================
--- head/sys/dev/de/if_devar.h	Tue Nov 17 14:08:42 2009	(r199377)
+++ head/sys/dev/de/if_devar.h	Tue Nov 17 14:13:30 2009	(r199378)
@@ -477,7 +477,7 @@ struct tulip_perfstat {
 	u_quad_t	perf_ifstart_cycles;
 	u_quad_t	perf_ifstart_one_cycles;
 	u_quad_t	perf_ifioctl_cycles;
-	u_quad_t	perf_ifwatchdog_cycles;
+	u_quad_t	perf_stat_cycles;
 	u_quad_t	perf_timeout_cycles;
 	u_quad_t	perf_txput_cycles;
 	u_quad_t	perf_txintr_cycles;
@@ -487,7 +487,7 @@ struct tulip_perfstat {
 	unsigned int	perf_ifstart;
 	unsigned int	perf_ifstart_one;
 	unsigned int	perf_ifioctl;
-	unsigned int	perf_ifwatchdog;
+	unsigned int	perf_stat;
 	unsigned int	perf_timeout;
 	unsigned int	perf_txput;
 	unsigned int	perf_txintr;
@@ -570,6 +570,7 @@ struct tulip_softc {
 	tulip_srom_connection_t	tulip_conntype;
 	struct callout		tulip_callout;
 	struct mtx		tulip_mutex;
+	struct callout	tulip_stat_timer;
 };
 
 #define	tulip_curperfstats	tulip_perfstats[TULIP_PERF_CURRENT]



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