svn commit: r250600 - in stable/9: lib/libpmc sys/dev/hwpmc sys/kern sys/sys
Fabien Thomas
fabient at FreeBSD.org
Wed May 15 04:39:13 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;
};
_______________________________________________
svn-src-all at freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscribe at freebsd.org"
More information about the svn-src-stable-9
mailing list