perf/x86/intel/cstate: Support multi-die/package
Some cstate counters become die-scoped on Xeon Cascade Lake-AP. Perf cstate driver needs to support die-scope cstate counters. Use topology_die_cpumask() to replace topology_core_cpumask(). For previous platforms which doesn't have multi-die, topology_die_cpumask() is identical as topology_core_cpumask(). There is no functional change for previous platforms. Name the die-scope PMU "cstate_die". Signed-off-by: Kan Liang <kan.liang@linux.intel.com> Signed-off-by: Len Brown <len.brown@intel.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Ingo Molnar <mingo@kernel.org> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: https://lkml.kernel.org/r/acb5e483287280eeb2b6daabe04a600b85e72a78.1557769318.git.len.brown@intel.com
This commit is contained in:

committed by
Thomas Gleixner

parent
b10b3efb88
commit
cb63ba0f67
@@ -302,7 +302,7 @@ static int cstate_pmu_event_init(struct perf_event *event)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
event->hw.event_base = pkg_msr[cfg].msr;
|
event->hw.event_base = pkg_msr[cfg].msr;
|
||||||
cpu = cpumask_any_and(&cstate_pkg_cpu_mask,
|
cpu = cpumask_any_and(&cstate_pkg_cpu_mask,
|
||||||
topology_core_cpumask(event->cpu));
|
topology_die_cpumask(event->cpu));
|
||||||
} else {
|
} else {
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
@@ -385,7 +385,7 @@ static int cstate_cpu_exit(unsigned int cpu)
|
|||||||
if (has_cstate_pkg &&
|
if (has_cstate_pkg &&
|
||||||
cpumask_test_and_clear_cpu(cpu, &cstate_pkg_cpu_mask)) {
|
cpumask_test_and_clear_cpu(cpu, &cstate_pkg_cpu_mask)) {
|
||||||
|
|
||||||
target = cpumask_any_but(topology_core_cpumask(cpu), cpu);
|
target = cpumask_any_but(topology_die_cpumask(cpu), cpu);
|
||||||
/* Migrate events if there is a valid target */
|
/* Migrate events if there is a valid target */
|
||||||
if (target < nr_cpu_ids) {
|
if (target < nr_cpu_ids) {
|
||||||
cpumask_set_cpu(target, &cstate_pkg_cpu_mask);
|
cpumask_set_cpu(target, &cstate_pkg_cpu_mask);
|
||||||
@@ -414,7 +414,7 @@ static int cstate_cpu_init(unsigned int cpu)
|
|||||||
* in the package cpu mask as the designated reader.
|
* in the package cpu mask as the designated reader.
|
||||||
*/
|
*/
|
||||||
target = cpumask_any_and(&cstate_pkg_cpu_mask,
|
target = cpumask_any_and(&cstate_pkg_cpu_mask,
|
||||||
topology_core_cpumask(cpu));
|
topology_die_cpumask(cpu));
|
||||||
if (has_cstate_pkg && target >= nr_cpu_ids)
|
if (has_cstate_pkg && target >= nr_cpu_ids)
|
||||||
cpumask_set_cpu(cpu, &cstate_pkg_cpu_mask);
|
cpumask_set_cpu(cpu, &cstate_pkg_cpu_mask);
|
||||||
|
|
||||||
@@ -663,7 +663,13 @@ static int __init cstate_init(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (has_cstate_pkg) {
|
if (has_cstate_pkg) {
|
||||||
err = perf_pmu_register(&cstate_pkg_pmu, cstate_pkg_pmu.name, -1);
|
if (topology_max_die_per_package() > 1) {
|
||||||
|
err = perf_pmu_register(&cstate_pkg_pmu,
|
||||||
|
"cstate_die", -1);
|
||||||
|
} else {
|
||||||
|
err = perf_pmu_register(&cstate_pkg_pmu,
|
||||||
|
cstate_pkg_pmu.name, -1);
|
||||||
|
}
|
||||||
if (err) {
|
if (err) {
|
||||||
has_cstate_pkg = false;
|
has_cstate_pkg = false;
|
||||||
pr_info("Failed to register cstate pkg pmu\n");
|
pr_info("Failed to register cstate pkg pmu\n");
|
||||||
|
Reference in New Issue
Block a user