]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
PM: EM: Change cpus' type from string to u64 array in the EM YNL spec
authorChangwoo Min <changwoo@igalia.com>
Thu, 8 Jan 2026 05:32:11 +0000 (14:32 +0900)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Fri, 9 Jan 2026 20:44:46 +0000 (21:44 +0100)
Previously, the cpus attribute was a string format which was a "%*pb"
stringification of a bitmap. That is not very consumable for a UAPI,
so let’s change it to an u64 array of CPU ids.

Suggested-by: Donald Hunter <donald.hunter@gmail.com>
Reviewed-by: Lukasz Luba <lukasz.luba@arm.com>
Reviewed-by: Donald Hunter <donald.hunter@gmail.com>
Signed-off-by: Changwoo Min <changwoo@igalia.com>
Link: https://patch.msgid.link/20260108053212.642478-4-changwoo@igalia.com
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Documentation/netlink/specs/dev-energymodel.yaml
kernel/power/em_netlink.c

index cbc4bc38f23cc5093ccabfdf747c5836e7385c5c..af8b8f72f722ce80a7b912ad66f730cc8504ad38 100644 (file)
@@ -73,7 +73,8 @@ attribute-sets:
         enum: perf-domain-flags
       -
         name: cpus
-        type: string
+        type: u64
+        multi-attr: true
         doc: >-
           CPUs that belong to this performance domain.
   -
index 6f6238c465bb938bd2d0ca64643245bdd09b1ba6..b6edb018c65a6a7d4803714e7b38e1a8803cc590 100644 (file)
 #include "em_netlink.h"
 #include "em_netlink_autogen.h"
 
-#define DEV_ENERGYMODEL_A_PERF_DOMAIN_CPUS_LEN         256
-
 /*************************** Command encoding ********************************/
 static int __em_nl_get_pd_size(struct em_perf_domain *pd, void *data)
 {
-       char cpus_buf[DEV_ENERGYMODEL_A_PERF_DOMAIN_CPUS_LEN];
+       int nr_cpus, msg_sz, cpus_sz;
        int *tot_msg_sz = data;
-       int msg_sz, cpus_sz;
 
-       cpus_sz = snprintf(cpus_buf, sizeof(cpus_buf), "%*pb",
-                          cpumask_pr_args(to_cpumask(pd->cpus)));
+       nr_cpus = cpumask_weight(to_cpumask(pd->cpus));
+       cpus_sz = nla_total_size_64bit(sizeof(u64)) * nr_cpus;
 
        msg_sz = nla_total_size(0) +
                 /* DEV_ENERGYMODEL_A_PERF_DOMAINS_PERF_DOMAIN */
@@ -44,9 +41,10 @@ static int __em_nl_get_pd_size(struct em_perf_domain *pd, void *data)
 
 static int __em_nl_get_pd(struct em_perf_domain *pd, void *data)
 {
-       char cpus_buf[DEV_ENERGYMODEL_A_PERF_DOMAIN_CPUS_LEN];
        struct sk_buff *msg = data;
+       struct cpumask *cpumask;
        struct nlattr *entry;
+       int cpu;
 
        entry = nla_nest_start(msg,
                               DEV_ENERGYMODEL_A_PERF_DOMAINS_PERF_DOMAIN);
@@ -61,10 +59,12 @@ static int __em_nl_get_pd(struct em_perf_domain *pd, void *data)
                              pd->flags, DEV_ENERGYMODEL_A_PERF_DOMAIN_PAD))
                goto out_cancel_nest;
 
-       snprintf(cpus_buf, sizeof(cpus_buf), "%*pb",
-                cpumask_pr_args(to_cpumask(pd->cpus)));
-       if (nla_put_string(msg, DEV_ENERGYMODEL_A_PERF_DOMAIN_CPUS, cpus_buf))
-               goto out_cancel_nest;
+       cpumask = to_cpumask(pd->cpus);
+       for_each_cpu(cpu, cpumask) {
+               if (nla_put_u64_64bit(msg, DEV_ENERGYMODEL_A_PERF_DOMAIN_CPUS,
+                                     cpu, DEV_ENERGYMODEL_A_PERF_DOMAIN_PAD))
+                       goto out_cancel_nest;
+       }
 
        nla_nest_end(msg, entry);