- 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.
This commit is contained in:
Joseph Koshy 2008-12-02 10:46:35 +00:00
parent a8f4518c30
commit dfd9bc23c9
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=185555
2 changed files with 13 additions and 14 deletions

View File

@ -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;

View File

@ -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)