]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
perf/x86/rapl: Move the cntr_mask to rapl_pmus struct
authorDhananjay Ugwekar <Dhananjay.Ugwekar@amd.com>
Fri, 15 Nov 2024 06:08:05 +0000 (06:08 +0000)
committerPeter Zijlstra <peterz@infradead.org>
Mon, 2 Dec 2024 11:01:37 +0000 (12:01 +0100)
Prepare for the addition of RAPL core energy counter support.

Move cntr_mask to rapl_pmus struct instead of adding a new global
cntr_mask for the new RAPL power_core PMU. This will also ensure that
the second "core_cntr_mask" is only created if needed (i.e. in case of
AMD CPUs).

Signed-off-by: Dhananjay Ugwekar <Dhananjay.Ugwekar@amd.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: "Gautham R. Shenoy" <gautham.shenoy@amd.com>
Reviewed-by: Zhang Rui <rui.zhang@intel.com>
Tested-by: Zhang Rui <rui.zhang@intel.com>
Link: https://lore.kernel.org/r/20241115060805.447565-10-Dhananjay.Ugwekar@amd.com
arch/x86/events/rapl.c

index aef2d0e86ababaae2bd3b37747c97f41547093b9..139c3086b83159dd1cd51f69351e10cdf02645a6 100644 (file)
@@ -129,6 +129,7 @@ struct rapl_pmu {
 struct rapl_pmus {
        struct pmu              pmu;
        unsigned int            nr_rapl_pmu;
+       unsigned int            cntr_mask;
        struct rapl_pmu         *rapl_pmu[] __counted_by(nr_rapl_pmu);
 };
 
@@ -148,7 +149,6 @@ struct rapl_model {
  /* 1/2^hw_unit Joule */
 static int rapl_pkg_hw_unit[NR_RAPL_PKG_DOMAINS] __read_mostly;
 static struct rapl_pmus *rapl_pmus_pkg;
-static unsigned int rapl_pkg_cntr_mask;
 static u64 rapl_timer_ms;
 static struct rapl_model *rapl_model;
 
@@ -364,7 +364,7 @@ static int rapl_pmu_event_init(struct perf_event *event)
        bit = cfg - 1;
 
        /* check event supported */
-       if (!(rapl_pkg_cntr_mask & (1 << bit)))
+       if (!(rapl_pmus_pkg->cntr_mask & (1 << bit)))
                return -EINVAL;
 
        /* unsupported modes and filters */
@@ -592,10 +592,10 @@ static void __init rapl_advertise(void)
        int i;
 
        pr_info("API unit is 2^-32 Joules, %d fixed counters, %llu ms ovfl timer\n",
-               hweight32(rapl_pkg_cntr_mask), rapl_timer_ms);
+               hweight32(rapl_pmus_pkg->cntr_mask), rapl_timer_ms);
 
        for (i = 0; i < NR_RAPL_PKG_DOMAINS; i++) {
-               if (rapl_pkg_cntr_mask & (1 << i)) {
+               if (rapl_pmus_pkg->cntr_mask & (1 << i)) {
                        pr_info("hw unit of domain %s 2^-%d Joules\n",
                                rapl_pkg_domain_names[i], rapl_pkg_hw_unit[i]);
                }
@@ -810,9 +810,6 @@ static int __init rapl_pmu_init(void)
 
        rapl_model = (struct rapl_model *) id->driver_data;
 
-       rapl_pkg_cntr_mask = perf_msr_probe(rapl_model->rapl_pkg_msrs, PERF_RAPL_PKG_EVENTS_MAX,
-                                       false, (void *) &rapl_model->pkg_events);
-
        ret = rapl_check_hw_unit();
        if (ret)
                return ret;
@@ -821,6 +818,10 @@ static int __init rapl_pmu_init(void)
        if (ret)
                return ret;
 
+       rapl_pmus_pkg->cntr_mask = perf_msr_probe(rapl_model->rapl_pkg_msrs,
+                                                 PERF_RAPL_PKG_EVENTS_MAX, false,
+                                                 (void *) &rapl_model->pkg_events);
+
        ret = perf_pmu_register(&rapl_pmus_pkg->pmu, "power", -1);
        if (ret)
                goto out;