Author: mav
Date: Tue Feb 26 18:13:42 2013
New Revision: 247329
URL: http://svnweb.freebsd.org/changeset/base/247329

Log:
  Add support for good old 8192Hz profiling clock to software PMC.
  
  Reviewed by:  fabient

Modified:
  head/lib/libpmc/pmc.soft.3
  head/sys/dev/hwpmc/hwpmc_soft.c
  head/sys/kern/kern_clock.c
  head/sys/kern/kern_clocksource.c

Modified: head/lib/libpmc/pmc.soft.3
==============================================================================
--- head/lib/libpmc/pmc.soft.3  Tue Feb 26 18:11:43 2013        (r247328)
+++ head/lib/libpmc/pmc.soft.3  Tue Feb 26 18:13:42 2013        (r247329)
@@ -23,7 +23,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd March 28, 2012
+.Dd February 26, 2013
 .Dt PMC.SOFT 3
 .Os
 .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: head/sys/dev/hwpmc/hwpmc_soft.c
==============================================================================
--- head/sys/dev/hwpmc/hwpmc_soft.c     Tue Feb 26 18:11:43 2013        
(r247328)
+++ head/sys/dev/hwpmc/hwpmc_soft.c     Tue Feb 26 18:13:42 2013        
(r247329)
@@ -45,6 +45,8 @@ __FBSDID("$FreeBSD$");
 #define        SOFT_CAPS (PMC_CAP_READ | PMC_CAP_WRITE | PMC_CAP_INTERRUPT | \
     PMC_CAP_USER | PMC_CAP_SYSTEM)
 
+PMC_SOFT_DECLARE( , , clock, prof);
+
 struct soft_descr {
        struct pmc_descr pm_descr;  /* "base class" */
 };
@@ -125,6 +127,8 @@ soft_allocate_pmc(int cpu, int ri, struc
                return (EINVAL);
        pmc_soft_ev_release(ps);
 
+       if (ev == pmc___clock_prof.ps_ev.pm_ev_code)
+               cpu_startprofclock();
        return (0);
 }
 
@@ -324,9 +328,8 @@ 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.
-        */
+       if (pmc->pm_event == pmc___clock_prof.ps_ev.pm_ev_code)
+               cpu_stopprofclock();
        return (0);
 }
 

Modified: head/sys/kern/kern_clock.c
==============================================================================
--- head/sys/kern/kern_clock.c  Tue Feb 26 18:11:43 2013        (r247328)
+++ head/sys/kern/kern_clock.c  Tue Feb 26 18:13:42 2013        (r247329)
@@ -78,6 +78,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/pmckern.h>
 PMC_SOFT_DEFINE( , , clock, hard);
 PMC_SOFT_DEFINE( , , clock, stat);
+PMC_SOFT_DEFINE( , , clock, prof);
 #endif
 
 #ifdef DEVICE_POLLING
@@ -817,6 +818,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: head/sys/kern/kern_clocksource.c
==============================================================================
--- head/sys/kern/kern_clocksource.c    Tue Feb 26 18:11:43 2013        
(r247328)
+++ head/sys/kern/kern_clocksource.c    Tue Feb 26 18:13:42 2013        
(r247329)
@@ -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();
 }
 
_______________________________________________
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