svn commit: r250600 - in stable/9: lib/libpmc sys/dev/hwpmc sys/kern sys/sys

Fabien Thomas fabient at FreeBSD.org
Mon May 13 15:18:38 UTC 2013


Author: fabient
Date: Mon May 13 15:18:36 2013
New Revision: 250600
URL: http://svnweb.freebsd.org/changeset/base/250600

Log:
  MFC r247329, r247836:
  Add support for good old 8192Hz profiling clock to software PMC.
  Add a generic way to call per event allocate / release function.

Modified:
  stable/9/lib/libpmc/pmc.soft.3
  stable/9/sys/dev/hwpmc/hwpmc_soft.c
  stable/9/sys/kern/kern_clock.c
  stable/9/sys/kern/kern_clocksource.c
  stable/9/sys/sys/pmckern.h
Directory Properties:
  stable/9/lib/libpmc/   (props changed)
  stable/9/sys/   (props changed)
  stable/9/sys/dev/   (props changed)
  stable/9/sys/sys/   (props changed)

Modified: stable/9/lib/libpmc/pmc.soft.3
==============================================================================
--- stable/9/lib/libpmc/pmc.soft.3	Mon May 13 15:00:36 2013	(r250599)
+++ stable/9/lib/libpmc/pmc.soft.3	Mon May 13 15:18:36 2013	(r250600)
@@ -23,7 +23,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd March 28, 2012
+.Dd February 26, 2013
 .Os
 .Dt PMC.SOFT 3
 .Sh NAME
@@ -61,6 +61,8 @@ The event specifiers supported by softwa
 Hard clock ticks.
 .It Li CLOCK.STAT
 Stat clock ticks.
+.It Li CLOCK.PROF
+Profiling clock ticks.
 .It Li LOCK.FAILED
 Lock acquisition failed.
 .It Li PAGE_FAULT.ALL

Modified: stable/9/sys/dev/hwpmc/hwpmc_soft.c
==============================================================================
--- stable/9/sys/dev/hwpmc/hwpmc_soft.c	Mon May 13 15:00:36 2013	(r250599)
+++ stable/9/sys/dev/hwpmc/hwpmc_soft.c	Mon May 13 15:18:36 2013	(r250600)
@@ -124,6 +124,9 @@ soft_allocate_pmc(int cpu, int ri, struc
 	if (ps == NULL)
 		return (EINVAL);
 	pmc_soft_ev_release(ps);
+	/* Module unload is protected by pmc SX lock. */
+	if (ps->ps_alloc != NULL)
+		ps->ps_alloc();
 
 	return (0);
 }
@@ -311,6 +314,8 @@ static int
 soft_release_pmc(int cpu, int ri, struct pmc *pmc)
 {
 	struct pmc_hw *phw;
+	enum pmc_event ev;
+	struct pmc_soft *ps;
 
 	(void) pmc;
 
@@ -324,9 +329,16 @@ soft_release_pmc(int cpu, int ri, struct
 	KASSERT(phw->phw_pmc == NULL,
 	    ("[soft,%d] PHW pmc %p non-NULL", __LINE__, phw->phw_pmc));
 
-	/*
-	 * Nothing to do.
-	 */
+	ev = pmc->pm_event;
+
+	/* Check if event is registered. */
+	ps = pmc_soft_ev_acquire(ev);
+	KASSERT(ps != NULL,
+	    ("[soft,%d] unregistered event %d", __LINE__, ev));
+	pmc_soft_ev_release(ps);
+	/* Module unload is protected by pmc SX lock. */
+	if (ps->ps_release != NULL)
+		ps->ps_release();
 	return (0);
 }
 

Modified: stable/9/sys/kern/kern_clock.c
==============================================================================
--- stable/9/sys/kern/kern_clock.c	Mon May 13 15:00:36 2013	(r250599)
+++ stable/9/sys/kern/kern_clock.c	Mon May 13 15:18:36 2013	(r250600)
@@ -78,6 +78,8 @@ __FBSDID("$FreeBSD$");
 #include <sys/pmckern.h>
 PMC_SOFT_DEFINE( , , clock, hard);
 PMC_SOFT_DEFINE( , , clock, stat);
+PMC_SOFT_DEFINE_EX( , , clock, prof, \
+    cpu_startprofclock, cpu_stopprofclock);
 #endif
 
 #ifdef DEVICE_POLLING
@@ -817,6 +819,10 @@ profclock_cnt(int cnt, int usermode, uin
 		}
 	}
 #endif
+#ifdef HWPMC_HOOKS
+	if (td->td_intr_frame != NULL)
+		PMC_SOFT_CALL_TF( , , clock, prof, td->td_intr_frame);
+#endif
 }
 
 /*

Modified: stable/9/sys/kern/kern_clocksource.c
==============================================================================
--- stable/9/sys/kern/kern_clocksource.c	Mon May 13 15:00:36 2013	(r250599)
+++ stable/9/sys/kern/kern_clocksource.c	Mon May 13 15:18:36 2013	(r250600)
@@ -732,12 +732,15 @@ cpu_startprofclock(void)
 {
 
 	ET_LOCK();
-	if (periodic) {
-		configtimer(0);
-		profiling = 1;
-		configtimer(1);
+	if (profiling == 0) {
+		if (periodic) {
+			configtimer(0);
+			profiling = 1;
+			configtimer(1);
+		} else
+			profiling = 1;
 	} else
-		profiling = 1;
+		profiling++;
 	ET_UNLOCK();
 }
 
@@ -749,12 +752,15 @@ cpu_stopprofclock(void)
 {
 
 	ET_LOCK();
-	if (periodic) {
-		configtimer(0);
+	if (profiling == 1) {
+		if (periodic) {
+			configtimer(0);
+			profiling = 0;
+			configtimer(1);
+		} else
 		profiling = 0;
-		configtimer(1);
 	} else
-		profiling = 0;
+		profiling--;
 	ET_UNLOCK();
 }
 

Modified: stable/9/sys/sys/pmckern.h
==============================================================================
--- stable/9/sys/sys/pmckern.h	Mon May 13 15:00:36 2013	(r250599)
+++ stable/9/sys/sys/pmckern.h	Mon May 13 15:18:36 2013	(r250600)
@@ -87,9 +87,9 @@ struct pmckern_soft {
  * Soft PMC.
  */
 
-#define PMC_SOFT_DEFINE(prov, mod, func, name)					\
+#define PMC_SOFT_DEFINE_EX(prov, mod, func, name, alloc, release)		\
 	struct pmc_soft pmc_##prov##_##mod##_##func##_##name =			\
-	    { 0, { #prov "_" #mod "_" #func "." #name, 0 } };			\
+	    { 0, alloc, release, { #prov "_" #mod "_" #func "." #name, 0 } };	\
 	SYSINIT(pmc_##prov##_##mod##_##func##_##name##_init, SI_SUB_KDTRACE, 	\
 	    SI_ORDER_SECOND + 1, pmc_soft_ev_register, 				\
 	    &pmc_##prov##_##mod##_##func##_##name );				\
@@ -97,6 +97,9 @@ struct pmckern_soft {
 	    SI_SUB_KDTRACE, SI_ORDER_SECOND + 1, pmc_soft_ev_deregister,	\
 	    &pmc_##prov##_##mod##_##func##_##name )
 
+#define PMC_SOFT_DEFINE(prov, mod, func, name)					\
+	PMC_SOFT_DEFINE_EX(prov, mod, func, name, NULL, NULL)
+
 #define PMC_SOFT_DECLARE(prov, mod, func, name)					\
 	extern struct pmc_soft pmc_##prov##_##mod##_##func##_##name
 
@@ -147,6 +150,8 @@ do {										\
 
 struct pmc_soft {
 	int				ps_running;
+	void				(*ps_alloc)(void);
+	void				(*ps_release)(void);
 	struct pmc_dyn_event_descr	ps_ev;
 };
 


More information about the svn-src-all mailing list