diff options
author | jkoshy <jkoshy@FreeBSD.org> | 2008-12-02 10:46:35 +0000 |
---|---|---|
committer | jkoshy <jkoshy@FreeBSD.org> | 2008-12-02 10:46:35 +0000 |
commit | 6836daa5f5aed0a947e6bb2dd4ce3a26da7f88a0 (patch) | |
tree | ab9934bd9ec0dead51f6623c52581334b3618731 /sys | |
parent | 7332cb8d3bd950d0a194924c1d866b3f7f03a546 (diff) | |
download | FreeBSD-src-6836daa5f5aed0a947e6bb2dd4ce3a26da7f88a0.zip FreeBSD-src-6836daa5f5aed0a947e6bb2dd4ce3a26da7f88a0.tar.gz |
- 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.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/hwpmc/hwpmc_amd.c | 17 | ||||
-rw-r--r-- | sys/dev/hwpmc/hwpmc_ppro.c | 10 |
2 files changed, 13 insertions, 14 deletions
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; diff --git a/sys/dev/hwpmc/hwpmc_ppro.c b/sys/dev/hwpmc/hwpmc_ppro.c index bc85873..909bfe2 100644 --- a/sys/dev/hwpmc/hwpmc_ppro.c +++ b/sys/dev/hwpmc/hwpmc_ppro.c @@ -688,17 +688,19 @@ p6_intr(int cpu, struct trapframe *tf) for (ri = 0; ri < P6_NPMCS; ri++) { - if (!P6_PMC_HAS_OVERFLOWED(ri)) - continue; - if ((pm = pc->pc_p6pmcs[ri].phw_pmc) == NULL || - pm->pm_state != PMC_STATE_RUNNING || !PMC_IS_SAMPLING_MODE(PMC_TO_MODE(pm))) { continue; } + if (!P6_PMC_HAS_OVERFLOWED(ri)) + continue; + retval = 1; + if (pm->pm_state != PMC_STATE_RUNNING) + continue; + error = pmc_process_interrupt(cpu, pm, tf, TRAPF_USERMODE(tf)); if (error) |