Commit-ID:  cb63ba0f670df1f0ddf21c6cc4bbe74db398742c
Gitweb:     https://git.kernel.org/tip/cb63ba0f670df1f0ddf21c6cc4bbe74db398742c
Author:     Kan Liang <kan.li...@linux.intel.com>
AuthorDate: Mon, 13 May 2019 13:58:59 -0400
Committer:  Thomas Gleixner <t...@linutronix.de>
CommitDate: Thu, 23 May 2019 10:08:35 +0200

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.li...@linux.intel.com>
Signed-off-by: Len Brown <len.br...@intel.com>
Signed-off-by: Thomas Gleixner <t...@linutronix.de>
Reviewed-by: Ingo Molnar <mi...@kernel.org>
Acked-by: Peter Zijlstra (Intel) <pet...@infradead.org>
Link: 
https://lkml.kernel.org/r/acb5e483287280eeb2b6daabe04a600b85e72a78.1557769318.git.len.br...@intel.com

---
 arch/x86/events/intel/cstate.c | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/arch/x86/events/intel/cstate.c b/arch/x86/events/intel/cstate.c
index 6072f92cb8ea..267d7f8e12ab 100644
--- a/arch/x86/events/intel/cstate.c
+++ b/arch/x86/events/intel/cstate.c
@@ -302,7 +302,7 @@ static int cstate_pmu_event_init(struct perf_event *event)
                        return -EINVAL;
                event->hw.event_base = pkg_msr[cfg].msr;
                cpu = cpumask_any_and(&cstate_pkg_cpu_mask,
-                                     topology_core_cpumask(event->cpu));
+                                     topology_die_cpumask(event->cpu));
        } else {
                return -ENOENT;
        }
@@ -385,7 +385,7 @@ static int cstate_cpu_exit(unsigned int cpu)
        if (has_cstate_pkg &&
            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 */
                if (target < nr_cpu_ids) {
                        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.
         */
        target = cpumask_any_and(&cstate_pkg_cpu_mask,
-                                topology_core_cpumask(cpu));
+                                topology_die_cpumask(cpu));
        if (has_cstate_pkg && target >= nr_cpu_ids)
                cpumask_set_cpu(cpu, &cstate_pkg_cpu_mask);
 
@@ -663,7 +663,13 @@ static int __init cstate_init(void)
        }
 
        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) {
                        has_cstate_pkg = false;
                        pr_info("Failed to register cstate pkg pmu\n");

Reply via email to