{
struct perf_event_attr *attr = &event->attr;
struct hw_perf_event *hwc = &event->hw;
- int config;
+ int config = -1;
int err;
if (!sh_pmu_initialized())
config = sh_pmu->event_map(attr->config);
break;
- default:
- return -EINVAL;
}
if (config == -1)
return &pmu;
}
-void hw_perf_event_setup(int cpu)
+static void sh_pmu_setup(int cpu)
{
struct cpu_hw_events *cpuhw = &per_cpu(cpu_hw_events, cpu);
memset(cpuhw, 0, sizeof(struct cpu_hw_events));
}
+static int __cpuinit
+sh_pmu_notifier(struct notifier_block *self, unsigned long action, void *hcpu)
+{
+ unsigned int cpu = (long)hcpu;
+
+ switch (action & ~CPU_TASKS_FROZEN) {
+ case CPU_UP_PREPARE:
+ sh_pmu_setup(cpu);
+ break;
+
+ default:
+ break;
+ }
+
+ return NOTIFY_OK;
+}
+
void hw_perf_enable(void)
{
if (!sh_pmu_initialized())
pr_info("Performance Events: %s support registered\n", pmu->name);
- WARN_ON(pmu->num_events >= MAX_HWEVENTS);
+ WARN_ON(pmu->num_events > MAX_HWEVENTS);
+ perf_cpu_notifier(sh_pmu_notifier);
return 0;
}