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@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to