[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20251225040104.982704-4-changwoo@igalia.com>
Date: Thu, 25 Dec 2025 13:01:03 +0900
From: Changwoo Min <changwoo@...lia.com>
To: lukasz.luba@....com,
rafael@...nel.org,
donald.hunter@...il.com,
kuba@...nel.org,
davem@...emloft.net,
edumazet@...gle.com,
pabeni@...hat.com,
horms@...nel.org,
lenb@...nel.org,
pavel@...nel.org,
changwoo@...lia.com
Cc: kernel-dev@...lia.com,
linux-pm@...r.kernel.org,
netdev@...r.kernel.org,
sched-ext@...ts.linux.dev,
linux-kernel@...r.kernel.org
Subject: [PATCH for 6.19 3/4] PM: EM: Change cpus' type from string to u64 array in the EM YNL spec
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@...il.com>
Signed-off-by: Changwoo Min <changwoo@...lia.com>
---
.../netlink/specs/dev-energymodel.yaml | 3 ++-
kernel/power/em_netlink.c | 22 +++++++++----------
2 files changed, 13 insertions(+), 12 deletions(-)
diff --git a/Documentation/netlink/specs/dev-energymodel.yaml b/Documentation/netlink/specs/dev-energymodel.yaml
index cbc4bc38f23c..af8b8f72f722 100644
--- a/Documentation/netlink/specs/dev-energymodel.yaml
+++ b/Documentation/netlink/specs/dev-energymodel.yaml
@@ -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.
-
diff --git a/kernel/power/em_netlink.c b/kernel/power/em_netlink.c
index 6f6238c465bb..b6edb018c65a 100644
--- a/kernel/power/em_netlink.c
+++ b/kernel/power/em_netlink.c
@@ -17,17 +17,14 @@
#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);
--
2.52.0
Powered by blists - more mailing lists