summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorjkoshy <jkoshy@FreeBSD.org>2008-12-02 10:46:35 +0000
committerjkoshy <jkoshy@FreeBSD.org>2008-12-02 10:46:35 +0000
commit6836daa5f5aed0a947e6bb2dd4ce3a26da7f88a0 (patch)
treeab9934bd9ec0dead51f6623c52581334b3618731 /sys
parent7332cb8d3bd950d0a194924c1d866b3f7f03a546 (diff)
downloadFreeBSD-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.c17
-rw-r--r--sys/dev/hwpmc/hwpmc_ppro.c10
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)
OpenPOWER on IntegriCloud