Skip to content

Commit 380ff27

Browse files
multics69rafaeljw
authored andcommitted
PM: EM: Add dump to get-perf-domains in the EM YNL spec
Add dump to get-perf-domains, so that a user can fetch either information about a specific performance domain with do or information about all performance domains with dump. Share the reply format of do and dump using perf-domain-attrs, so remove perf-domains. The YNL spec, autogenerated files, and the do implementation are updated, and the dump implementation is added. 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-5-changwoo@igalia.com Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
1 parent d29b900 commit 380ff27

5 files changed

Lines changed: 80 additions & 38 deletions

File tree

Documentation/netlink/specs/dev-energymodel.yaml

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -42,16 +42,6 @@ definitions:
4242
missing real power information.
4343
4444
attribute-sets:
45-
-
46-
name: perf-domains
47-
doc: >-
48-
Information on all the performance domains.
49-
attributes:
50-
-
51-
name: perf-domain
52-
type: nest
53-
nested-attributes: perf-domain
54-
multi-attr: true
5545
-
5646
name: perf-domain
5747
doc: >-
@@ -133,12 +123,21 @@ operations:
133123
list:
134124
-
135125
name: get-perf-domains
136-
attribute-set: perf-domains
126+
attribute-set: perf-domain
137127
doc: Get the list of information for all performance domains.
138128
do:
139-
reply:
129+
request:
140130
attributes:
141-
- perf-domain
131+
- perf-domain-id
132+
reply:
133+
attributes: &perf-domain-attrs
134+
- pad
135+
- perf-domain-id
136+
- flags
137+
- cpus
138+
dump:
139+
reply:
140+
attributes: *perf-domain-attrs
142141
-
143142
name: get-perf-table
144143
attribute-set: perf-table

include/uapi/linux/dev_energymodel.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,6 @@ enum dev_energymodel_perf_domain_flags {
3636
DEV_ENERGYMODEL_PERF_DOMAIN_FLAGS_PERF_DOMAIN_ARTIFICIAL = 4,
3737
};
3838

39-
enum {
40-
DEV_ENERGYMODEL_A_PERF_DOMAINS_PERF_DOMAIN = 1,
41-
42-
__DEV_ENERGYMODEL_A_PERF_DOMAINS_MAX,
43-
DEV_ENERGYMODEL_A_PERF_DOMAINS_MAX = (__DEV_ENERGYMODEL_A_PERF_DOMAINS_MAX - 1)
44-
};
45-
4639
enum {
4740
DEV_ENERGYMODEL_A_PERF_DOMAIN_PAD = 1,
4841
DEV_ENERGYMODEL_A_PERF_DOMAIN_PERF_DOMAIN_ID,

kernel/power/em_netlink.c

Lines changed: 52 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@
1818
#include "em_netlink_autogen.h"
1919

2020
/*************************** Command encoding ********************************/
21+
struct dump_ctx {
22+
int idx;
23+
int start;
24+
struct sk_buff *skb;
25+
struct netlink_callback *cb;
26+
};
27+
2128
static int __em_nl_get_pd_size(struct em_perf_domain *pd, void *data)
2229
{
2330
int nr_cpus, msg_sz, cpus_sz;
@@ -43,14 +50,8 @@ static int __em_nl_get_pd(struct em_perf_domain *pd, void *data)
4350
{
4451
struct sk_buff *msg = data;
4552
struct cpumask *cpumask;
46-
struct nlattr *entry;
4753
int cpu;
4854

49-
entry = nla_nest_start(msg,
50-
DEV_ENERGYMODEL_A_PERF_DOMAINS_PERF_DOMAIN);
51-
if (!entry)
52-
goto out_cancel_nest;
53-
5455
if (nla_put_u32(msg, DEV_ENERGYMODEL_A_PERF_DOMAIN_PERF_DOMAIN_ID,
5556
pd->id))
5657
goto out_cancel_nest;
@@ -66,26 +67,50 @@ static int __em_nl_get_pd(struct em_perf_domain *pd, void *data)
6667
goto out_cancel_nest;
6768
}
6869

69-
nla_nest_end(msg, entry);
70-
7170
return 0;
7271

7372
out_cancel_nest:
74-
nla_nest_cancel(msg, entry);
75-
7673
return -EMSGSIZE;
7774
}
7875

76+
static int __em_nl_get_pd_for_dump(struct em_perf_domain *pd, void *data)
77+
{
78+
const struct genl_info *info;
79+
struct dump_ctx *ctx = data;
80+
void *hdr;
81+
int ret;
82+
83+
if (ctx->idx++ < ctx->start)
84+
return 0;
85+
86+
info = genl_info_dump(ctx->cb);
87+
hdr = genlmsg_iput(ctx->skb, info);
88+
if (!hdr) {
89+
genlmsg_cancel(ctx->skb, hdr);
90+
return -EMSGSIZE;
91+
}
92+
93+
ret = __em_nl_get_pd(pd, ctx->skb);
94+
genlmsg_end(ctx->skb, hdr);
95+
return ret;
96+
}
97+
7998
int dev_energymodel_nl_get_perf_domains_doit(struct sk_buff *skb,
8099
struct genl_info *info)
81100
{
101+
int id, ret = -EMSGSIZE, msg_sz = 0;
102+
int cmd = info->genlhdr->cmd;
103+
struct em_perf_domain *pd;
82104
struct sk_buff *msg;
83105
void *hdr;
84-
int cmd = info->genlhdr->cmd;
85-
int ret = -EMSGSIZE, msg_sz = 0;
86106

87-
for_each_em_perf_domain(__em_nl_get_pd_size, &msg_sz);
107+
if (!info->attrs[DEV_ENERGYMODEL_A_PERF_DOMAIN_PERF_DOMAIN_ID])
108+
return -EINVAL;
88109

110+
id = nla_get_u32(info->attrs[DEV_ENERGYMODEL_A_PERF_DOMAIN_PERF_DOMAIN_ID]);
111+
pd = em_perf_domain_get_by_id(id);
112+
113+
__em_nl_get_pd_size(pd, &msg_sz);
89114
msg = genlmsg_new(msg_sz, GFP_KERNEL);
90115
if (!msg)
91116
return -ENOMEM;
@@ -94,10 +119,9 @@ int dev_energymodel_nl_get_perf_domains_doit(struct sk_buff *skb,
94119
if (!hdr)
95120
goto out_free_msg;
96121

97-
ret = for_each_em_perf_domain(__em_nl_get_pd, msg);
122+
ret = __em_nl_get_pd(pd, msg);
98123
if (ret)
99124
goto out_cancel_msg;
100-
101125
genlmsg_end(msg, hdr);
102126

103127
return genlmsg_reply(msg, info);
@@ -106,10 +130,22 @@ int dev_energymodel_nl_get_perf_domains_doit(struct sk_buff *skb,
106130
genlmsg_cancel(msg, hdr);
107131
out_free_msg:
108132
nlmsg_free(msg);
109-
110133
return ret;
111134
}
112135

136+
int dev_energymodel_nl_get_perf_domains_dumpit(struct sk_buff *skb,
137+
struct netlink_callback *cb)
138+
{
139+
struct dump_ctx ctx = {
140+
.idx = 0,
141+
.start = cb->args[0],
142+
.skb = skb,
143+
.cb = cb,
144+
};
145+
146+
return for_each_em_perf_domain(__em_nl_get_pd_for_dump, &ctx);
147+
}
148+
113149
static struct em_perf_domain *__em_nl_get_pd_table_id(struct nlattr **attrs)
114150
{
115151
struct em_perf_domain *pd;

kernel/power/em_netlink_autogen.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,29 @@
1111

1212
#include <uapi/linux/dev_energymodel.h>
1313

14+
/* DEV_ENERGYMODEL_CMD_GET_PERF_DOMAINS - do */
15+
static const struct nla_policy dev_energymodel_get_perf_domains_nl_policy[DEV_ENERGYMODEL_A_PERF_DOMAIN_PERF_DOMAIN_ID + 1] = {
16+
[DEV_ENERGYMODEL_A_PERF_DOMAIN_PERF_DOMAIN_ID] = { .type = NLA_U32, },
17+
};
18+
1419
/* DEV_ENERGYMODEL_CMD_GET_PERF_TABLE - do */
1520
static const struct nla_policy dev_energymodel_get_perf_table_nl_policy[DEV_ENERGYMODEL_A_PERF_TABLE_PERF_DOMAIN_ID + 1] = {
1621
[DEV_ENERGYMODEL_A_PERF_TABLE_PERF_DOMAIN_ID] = { .type = NLA_U32, },
1722
};
1823

1924
/* Ops table for dev_energymodel */
2025
static const struct genl_split_ops dev_energymodel_nl_ops[] = {
26+
{
27+
.cmd = DEV_ENERGYMODEL_CMD_GET_PERF_DOMAINS,
28+
.doit = dev_energymodel_nl_get_perf_domains_doit,
29+
.policy = dev_energymodel_get_perf_domains_nl_policy,
30+
.maxattr = DEV_ENERGYMODEL_A_PERF_DOMAIN_PERF_DOMAIN_ID,
31+
.flags = GENL_CMD_CAP_DO,
32+
},
2133
{
2234
.cmd = DEV_ENERGYMODEL_CMD_GET_PERF_DOMAINS,
23-
.doit = dev_energymodel_nl_get_perf_domains_doit,
24-
.flags = GENL_CMD_CAP_DO,
35+
.dumpit = dev_energymodel_nl_get_perf_domains_dumpit,
36+
.flags = GENL_CMD_CAP_DUMP,
2537
},
2638
{
2739
.cmd = DEV_ENERGYMODEL_CMD_GET_PERF_TABLE,

kernel/power/em_netlink_autogen.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414

1515
int dev_energymodel_nl_get_perf_domains_doit(struct sk_buff *skb,
1616
struct genl_info *info);
17+
int dev_energymodel_nl_get_perf_domains_dumpit(struct sk_buff *skb,
18+
struct netlink_callback *cb);
1719
int dev_energymodel_nl_get_perf_table_doit(struct sk_buff *skb,
1820
struct genl_info *info);
1921

0 commit comments

Comments
 (0)