Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 288323
b: refs/heads/master
c: a0feb6d
h: refs/heads/master
i:
  288321: a22d1a1
  288319: 7f8245b
v: v3
  • Loading branch information
Lorenzo Pieralisi authored and Russell King committed Mar 7, 2012
1 parent 0b1f7aa commit 6df0726
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 3f31ae121348afd9ed39700ea2a63c17cd7eeed1
refs/heads/master: a0feb6db0fe03326d7d2c7a4615ce3289615c023
23 changes: 23 additions & 0 deletions trunk/arch/arm/kernel/perf_event.c
Original file line number Diff line number Diff line change
Expand Up @@ -679,6 +679,28 @@ static void __init cpu_pmu_init(struct arm_pmu *armpmu)
armpmu->type = ARM_PMU_DEVICE_CPU;
}

/*
* PMU hardware loses all context when a CPU goes offline.
* When a CPU is hotplugged back in, since some hardware registers are
* UNKNOWN at reset, the PMU must be explicitly reset to avoid reading
* junk values out of them.
*/
static int __cpuinit pmu_cpu_notify(struct notifier_block *b,
unsigned long action, void *hcpu)
{
if ((action & ~CPU_TASKS_FROZEN) != CPU_STARTING)
return NOTIFY_DONE;

if (cpu_pmu && cpu_pmu->reset)
cpu_pmu->reset(NULL);

return NOTIFY_OK;
}

static struct notifier_block __cpuinitdata pmu_cpu_notifier = {
.notifier_call = pmu_cpu_notify,
};

/*
* CPU PMU identification and registration.
*/
Expand Down Expand Up @@ -730,6 +752,7 @@ init_hw_perf_events(void)
pr_info("enabled with %s PMU driver, %d counters available\n",
cpu_pmu->name, cpu_pmu->num_events);
cpu_pmu_init(cpu_pmu);
register_cpu_notifier(&pmu_cpu_notifier);
armpmu_register(cpu_pmu, "cpu", PERF_TYPE_RAW);
} else {
pr_info("no hardware support available\n");
Expand Down

0 comments on commit 6df0726

Please sign in to comment.