|
@@ -365,7 +365,7 @@ static int cstate_pmu_event_add(struct perf_event *event, int mode)
|
|
|
* Check if exiting cpu is the designated reader. If so migrate the
|
|
|
* events when there is a valid target available
|
|
|
*/
|
|
|
-static void cstate_cpu_exit(int cpu)
|
|
|
+static int cstate_cpu_exit(unsigned int cpu)
|
|
|
{
|
|
|
unsigned int target;
|
|
|
|
|
@@ -390,9 +390,10 @@ static void cstate_cpu_exit(int cpu)
|
|
|
perf_pmu_migrate_context(&cstate_pkg_pmu, cpu, target);
|
|
|
}
|
|
|
}
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
-static void cstate_cpu_init(int cpu)
|
|
|
+static int cstate_cpu_init(unsigned int cpu)
|
|
|
{
|
|
|
unsigned int target;
|
|
|
|
|
@@ -414,31 +415,10 @@ static void cstate_cpu_init(int cpu)
|
|
|
topology_core_cpumask(cpu));
|
|
|
if (has_cstate_pkg && target >= nr_cpu_ids)
|
|
|
cpumask_set_cpu(cpu, &cstate_pkg_cpu_mask);
|
|
|
-}
|
|
|
|
|
|
-static int cstate_cpu_notifier(struct notifier_block *self,
|
|
|
- unsigned long action, void *hcpu)
|
|
|
-{
|
|
|
- unsigned int cpu = (long)hcpu;
|
|
|
-
|
|
|
- switch (action & ~CPU_TASKS_FROZEN) {
|
|
|
- case CPU_STARTING:
|
|
|
- cstate_cpu_init(cpu);
|
|
|
- break;
|
|
|
- case CPU_DOWN_PREPARE:
|
|
|
- cstate_cpu_exit(cpu);
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
- return NOTIFY_OK;
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
-static struct notifier_block cstate_cpu_nb = {
|
|
|
- .notifier_call = cstate_cpu_notifier,
|
|
|
- .priority = CPU_PRI_PERF + 1,
|
|
|
-};
|
|
|
-
|
|
|
static struct pmu cstate_core_pmu = {
|
|
|
.attr_groups = core_attr_groups,
|
|
|
.name = "cstate_core",
|
|
@@ -599,18 +579,20 @@ static inline void cstate_cleanup(void)
|
|
|
|
|
|
static int __init cstate_init(void)
|
|
|
{
|
|
|
- int cpu, err;
|
|
|
+ int err;
|
|
|
|
|
|
- cpu_notifier_register_begin();
|
|
|
- for_each_online_cpu(cpu)
|
|
|
- cstate_cpu_init(cpu);
|
|
|
+ cpuhp_setup_state(CPUHP_AP_PERF_X86_CSTATE_STARTING,
|
|
|
+ "AP_PERF_X86_CSTATE_STARTING", cstate_cpu_init,
|
|
|
+ NULL);
|
|
|
+ cpuhp_setup_state(CPUHP_AP_PERF_X86_CSTATE_ONLINE,
|
|
|
+ "AP_PERF_X86_CSTATE_ONLINE", NULL, cstate_cpu_exit);
|
|
|
|
|
|
if (has_cstate_core) {
|
|
|
err = perf_pmu_register(&cstate_core_pmu, cstate_core_pmu.name, -1);
|
|
|
if (err) {
|
|
|
has_cstate_core = false;
|
|
|
pr_info("Failed to register cstate core pmu\n");
|
|
|
- goto out;
|
|
|
+ return err;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -620,12 +602,10 @@ static int __init cstate_init(void)
|
|
|
has_cstate_pkg = false;
|
|
|
pr_info("Failed to register cstate pkg pmu\n");
|
|
|
cstate_cleanup();
|
|
|
- goto out;
|
|
|
+ return err;
|
|
|
}
|
|
|
}
|
|
|
- __register_cpu_notifier(&cstate_cpu_nb);
|
|
|
-out:
|
|
|
- cpu_notifier_register_done();
|
|
|
+
|
|
|
return err;
|
|
|
}
|
|
|
|
|
@@ -651,9 +631,8 @@ module_init(cstate_pmu_init);
|
|
|
|
|
|
static void __exit cstate_pmu_exit(void)
|
|
|
{
|
|
|
- cpu_notifier_register_begin();
|
|
|
- __unregister_cpu_notifier(&cstate_cpu_nb);
|
|
|
+ cpuhp_remove_state_nocalls(CPUHP_AP_PERF_X86_CSTATE_ONLINE);
|
|
|
+ cpuhp_remove_state_nocalls(CPUHP_AP_PERF_X86_CSTATE_STARTING);
|
|
|
cstate_cleanup();
|
|
|
- cpu_notifier_register_done();
|
|
|
}
|
|
|
module_exit(cstate_pmu_exit);
|