Commit cb63ba0f authored by Kan Liang's avatar Kan Liang Committed by Thomas Gleixner

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: default avatarKan Liang <kan.liang@linux.intel.com>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Reviewed-by: default avatarIngo Molnar <mingo@kernel.org>
Acked-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lkml.kernel.org/r/acb5e483287280eeb2b6daabe04a600b85e72a78.1557769318.git.len.brown@intel.com
parent b10b3efb
...@@ -302,7 +302,7 @@ static int cstate_pmu_event_init(struct perf_event *event) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment