From 6836daa5f5aed0a947e6bb2dd4ce3a26da7f88a0 Mon Sep 17 00:00:00 2001 From: jkoshy Date: Tue, 2 Dec 2008 10:46:35 +0000 Subject: - Efficiency tweak: when checking for PMC overflows, only go to hardware for PMCs that have been configured for sampling. - Bug fix: acknowledge PMC hardware overflows irrespective of the the (software) PMC's state. --- sys/dev/hwpmc/hwpmc_amd.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) (limited to 'sys/dev/hwpmc/hwpmc_amd.c') diff --git a/sys/dev/hwpmc/hwpmc_amd.c b/sys/dev/hwpmc/hwpmc_amd.c index 7e3719f..268904b 100644 --- a/sys/dev/hwpmc/hwpmc_amd.c +++ b/sys/dev/hwpmc/hwpmc_amd.c @@ -632,7 +632,6 @@ amd_intr(int cpu, struct trapframe *tf) uint32_t config, evsel, perfctr; struct pmc *pm; struct amd_cpu *pac; - struct pmc_hw *phw; pmc_value_t v; KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), @@ -660,21 +659,19 @@ amd_intr(int cpu, struct trapframe *tf) for (i = 0; retval == 0 && i < AMD_NPMCS; i++) { - if (!AMD_PMC_HAS_OVERFLOWED(i)) - continue; - - phw = &pac->pc_amdpmcs[i]; - - KASSERT(phw != NULL, ("[amd,%d] null PHW pointer", __LINE__)); - - if ((pm = phw->phw_pmc) == NULL || - pm->pm_state != PMC_STATE_RUNNING || + if ((pm = pac->pc_amdpmcs[i].phw_pmc) == NULL || !PMC_IS_SAMPLING_MODE(PMC_TO_MODE(pm))) { continue; } + if (!AMD_PMC_HAS_OVERFLOWED(i)) + continue; + retval = 1; /* Found an interrupting PMC. */ + if (pm->pm_state != PMC_STATE_RUNNING) + continue; + /* Stop the PMC, reload count. */ evsel = AMD_PMC_EVSEL_0 + i; perfctr = AMD_PMC_PERFCTR_0 + i; -- cgit v1.1