|
@@ -664,30 +664,22 @@ static struct pmu cpumf_pmu = {
|
|
|
.cancel_txn = cpumf_pmu_cancel_txn,
|
|
|
};
|
|
|
|
|
|
-static int cpumf_pmu_notifier(struct notifier_block *self, unsigned long action,
|
|
|
- void *hcpu)
|
|
|
+static int cpumf_pmf_setup(unsigned int cpu, int flags)
|
|
|
{
|
|
|
- int flags;
|
|
|
-
|
|
|
- switch (action & ~CPU_TASKS_FROZEN) {
|
|
|
- case CPU_ONLINE:
|
|
|
- case CPU_DOWN_FAILED:
|
|
|
- flags = PMC_INIT;
|
|
|
- local_irq_disable();
|
|
|
- setup_pmc_cpu(&flags);
|
|
|
- local_irq_enable();
|
|
|
- break;
|
|
|
- case CPU_DOWN_PREPARE:
|
|
|
- flags = PMC_RELEASE;
|
|
|
- local_irq_disable();
|
|
|
- setup_pmc_cpu(&flags);
|
|
|
- local_irq_enable();
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
+ local_irq_disable();
|
|
|
+ setup_pmc_cpu(&flags);
|
|
|
+ local_irq_enable();
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int s390_pmu_online_cpu(unsigned int cpu)
|
|
|
+{
|
|
|
+ return cpumf_pmf_setup(cpu, PMC_INIT);
|
|
|
+}
|
|
|
|
|
|
- return NOTIFY_OK;
|
|
|
+static int s390_pmu_offline_cpu(unsigned int cpu)
|
|
|
+{
|
|
|
+ return cpumf_pmf_setup(cpu, PMC_RELEASE);
|
|
|
}
|
|
|
|
|
|
static int __init cpumf_pmu_init(void)
|
|
@@ -707,7 +699,7 @@ static int __init cpumf_pmu_init(void)
|
|
|
if (rc) {
|
|
|
pr_err("Registering for CPU-measurement alerts "
|
|
|
"failed with rc=%i\n", rc);
|
|
|
- goto out;
|
|
|
+ return rc;
|
|
|
}
|
|
|
|
|
|
cpumf_pmu.attr_groups = cpumf_cf_event_group();
|
|
@@ -716,10 +708,10 @@ static int __init cpumf_pmu_init(void)
|
|
|
pr_err("Registering the cpum_cf PMU failed with rc=%i\n", rc);
|
|
|
unregister_external_irq(EXT_IRQ_MEASURE_ALERT,
|
|
|
cpumf_measurement_alert);
|
|
|
- goto out;
|
|
|
+ return rc;
|
|
|
}
|
|
|
- perf_cpu_notifier(cpumf_pmu_notifier);
|
|
|
-out:
|
|
|
- return rc;
|
|
|
+ return cpuhp_setup_state(CPUHP_AP_PERF_S390_CF_ONLINE,
|
|
|
+ "AP_PERF_S390_CF_ONLINE",
|
|
|
+ s390_pmu_online_cpu, s390_pmu_offline_cpu);
|
|
|
}
|
|
|
early_initcall(cpumf_pmu_init);
|