From owner-svn-src-stable@FreeBSD.ORG Mon May 13 15:18:38 2013 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 120E3C3C; Mon, 13 May 2013 15:18:38 +0000 (UTC) (envelope-from fabient@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) by mx1.freebsd.org (Postfix) with ESMTP id E734AEBC; Mon, 13 May 2013 15:18:37 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.6/8.14.6) with ESMTP id r4DFIbU1065183; Mon, 13 May 2013 15:18:37 GMT (envelope-from fabient@svn.freebsd.org) Received: (from fabient@localhost) by svn.freebsd.org (8.14.6/8.14.5/Submit) id r4DFIaJg065174; Mon, 13 May 2013 15:18:36 GMT (envelope-from fabient@svn.freebsd.org) Message-Id: <201305131518.r4DFIaJg065174@svn.freebsd.org> From: Fabien Thomas Date: Mon, 13 May 2013 15:18:36 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org Subject: svn commit: r250600 - in stable/9: lib/libpmc sys/dev/hwpmc sys/kern sys/sys X-SVN-Group: stable-9 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 13 May 2013 15:18:38 -0000 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 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; };