History

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.

Changwoo Min committed 10 months ago

Commit 380ff271 parent d29b9005 files · +80 −38Browse files

Unified · Split

5 files
  1. Documentation/netlink/specs/dev-energymodel.yaml +12 −13
  2. include/uapi/linux/dev_energymodel.h +0 −7
  3. kernel/power/em_netlink.c +52 −16
  4. kernel/power/em_netlink_autogen.c +14 −2
  5. kernel/power/em_netlink_autogen.h +2 −0
Documentation/netlink/specs/dev-energymodel.yaml+12−13
@@ -42,16 +42,6 @@ definitions: · 41 unmodified lines
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: · 75 unmodified lines
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+0−7
@@ -36,13 +36,6 @@ enum dev_energymodel_perf_domain_flags { · 35 unmodified lines
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+52−16
@@ -18,6 +18,13 @@ · 17 unmodified lines
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) · 19 unmodified lines
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) · 9 unmodified lines
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, · 2 unmodified lines
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 @@ out_cancel_msg: · 2 unmodified lines
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+14−2
@@ -11,6 +11,11 @@ · 10 unmodified lines
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, },
@@ -18,10 +23,17 @@ static const struct nla_policy dev_energymodel_get_perf_table_nl_policy[DEV_ENER · 1 unmodified line
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+2−0
@@ -14,6 +14,8 @@ · 13 unmodified lines
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