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
42 missing real power information.42 missing real power information.
43 43
44attribute-sets:44attribute-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
55 -45 -
56 name: perf-domain46 name: perf-domain
57 doc: >-47 doc: >-
@@ -133,12 +123,21 @@ operations: · 75 unmodified lines
133 list:123 list:
134 -124 -
135 name: get-perf-domains125 name: get-perf-domains
136 attribute-set: perf-domains126 attribute-set: perf-domain
137 doc: Get the list of information for all performance domains.127 doc: Get the list of information for all performance domains.
138 do:128 do:
139 reply:129 request:
140 attributes:130 attributes:
141 - perf-domain131 - 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
142 -141 -
143 name: get-perf-table142 name: get-perf-table
144 attribute-set: perf-table143 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
36 DEV_ENERGYMODEL_PERF_DOMAIN_FLAGS_PERF_DOMAIN_ARTIFICIAL = 4,36 DEV_ENERGYMODEL_PERF_DOMAIN_FLAGS_PERF_DOMAIN_ARTIFICIAL = 4,
37};37};
38 38
39enum {
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
46enum {39enum {
47 DEV_ENERGYMODEL_A_PERF_DOMAIN_PAD = 1,40 DEV_ENERGYMODEL_A_PERF_DOMAIN_PAD = 1,
48 DEV_ENERGYMODEL_A_PERF_DOMAIN_PERF_DOMAIN_ID,41 DEV_ENERGYMODEL_A_PERF_DOMAIN_PERF_DOMAIN_ID,
kernel/power/em_netlink.c+52−16
@@ -18,6 +18,13 @@ · 17 unmodified lines
18#include "em_netlink_autogen.h"18#include "em_netlink_autogen.h"
19 19
20/*************************** Command encoding ********************************/20/*************************** Command encoding ********************************/
21struct dump_ctx {
22 int idx;
23 int start;
24 struct sk_buff *skb;
25 struct netlink_callback *cb;
26};
27
21static int __em_nl_get_pd_size(struct em_perf_domain *pd, void *data)28static int __em_nl_get_pd_size(struct em_perf_domain *pd, void *data)
22{29{
23 int nr_cpus, msg_sz, cpus_sz;30 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
43{50{
44 struct sk_buff *msg = data;51 struct sk_buff *msg = data;
45 struct cpumask *cpumask;52 struct cpumask *cpumask;
46 struct nlattr *entry;
47 int cpu;53 int cpu;
48 54
49 entry = nla_nest_start(msg,
50 DEV_ENERGYMODEL_A_PERF_DOMAINS_PERF_DOMAIN);
51 if (!entry)
52 goto out_cancel_nest;
53
54 if (nla_put_u32(msg, DEV_ENERGYMODEL_A_PERF_DOMAIN_PERF_DOMAIN_ID,55 if (nla_put_u32(msg, DEV_ENERGYMODEL_A_PERF_DOMAIN_PERF_DOMAIN_ID,
55 pd->id))56 pd->id))
56 goto out_cancel_nest;57 goto out_cancel_nest;
@@ -66,26 +67,50 @@ static int __em_nl_get_pd(struct em_perf_domain *pd, void *data) · 9 unmodified lines
66 goto out_cancel_nest;67 goto out_cancel_nest;
67 }68 }
68 69
69 nla_nest_end(msg, entry);
70
71 return 0;70 return 0;
72 71
73out_cancel_nest:72out_cancel_nest:
74 nla_nest_cancel(msg, entry);
75
76 return -EMSGSIZE;73 return -EMSGSIZE;
77}74}
78 75
76static 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
79int dev_energymodel_nl_get_perf_domains_doit(struct sk_buff *skb,98int dev_energymodel_nl_get_perf_domains_doit(struct sk_buff *skb,
80 struct genl_info *info)99 struct genl_info *info)
81{100{
101 int id, ret = -EMSGSIZE, msg_sz = 0;
102 int cmd = info->genlhdr->cmd;
103 struct em_perf_domain *pd;
82 struct sk_buff *msg;104 struct sk_buff *msg;
83 void *hdr;105 void *hdr;
84 int cmd = info->genlhdr->cmd;
85 int ret = -EMSGSIZE, msg_sz = 0;
86 106
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;
88 109
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);
89 msg = genlmsg_new(msg_sz, GFP_KERNEL);114 msg = genlmsg_new(msg_sz, GFP_KERNEL);
90 if (!msg)115 if (!msg)
91 return -ENOMEM;116 return -ENOMEM;
@@ -94,10 +119,9 @@ int dev_energymodel_nl_get_perf_domains_doit(struct sk_buff *skb, · 2 unmodified lines
94 if (!hdr)119 if (!hdr)
95 goto out_free_msg;120 goto out_free_msg;
96 121
97 ret = for_each_em_perf_domain(__em_nl_get_pd, msg);122 ret = __em_nl_get_pd(pd, msg);
98 if (ret)123 if (ret)
99 goto out_cancel_msg;124 goto out_cancel_msg;
100
101 genlmsg_end(msg, hdr);125 genlmsg_end(msg, hdr);
102 126
103 return genlmsg_reply(msg, info);127 return genlmsg_reply(msg, info);
@@ -106,10 +130,22 @@ out_cancel_msg: · 2 unmodified lines
106 genlmsg_cancel(msg, hdr);130 genlmsg_cancel(msg, hdr);
107out_free_msg:131out_free_msg:
108 nlmsg_free(msg);132 nlmsg_free(msg);
109
110 return ret;133 return ret;
111}134}
112 135
136int 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
113static struct em_perf_domain *__em_nl_get_pd_table_id(struct nlattr **attrs)149static struct em_perf_domain *__em_nl_get_pd_table_id(struct nlattr **attrs)
114{150{
115 struct em_perf_domain *pd;151 struct em_perf_domain *pd;
kernel/power/em_netlink_autogen.c+14−2
@@ -11,6 +11,11 @@ · 10 unmodified lines
11 11
12#include <uapi/linux/dev_energymodel.h>12#include <uapi/linux/dev_energymodel.h>
13 13
14/* DEV_ENERGYMODEL_CMD_GET_PERF_DOMAINS - do */
15static 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
14/* DEV_ENERGYMODEL_CMD_GET_PERF_TABLE - do */19/* DEV_ENERGYMODEL_CMD_GET_PERF_TABLE - do */
15static const struct nla_policy dev_energymodel_get_perf_table_nl_policy[DEV_ENERGYMODEL_A_PERF_TABLE_PERF_DOMAIN_ID + 1] = {20static const struct nla_policy dev_energymodel_get_perf_table_nl_policy[DEV_ENERGYMODEL_A_PERF_TABLE_PERF_DOMAIN_ID + 1] = {
16 [DEV_ENERGYMODEL_A_PERF_TABLE_PERF_DOMAIN_ID] = { .type = NLA_U32, },21 [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
18 23
19/* Ops table for dev_energymodel */24/* Ops table for dev_energymodel */
20static const struct genl_split_ops dev_energymodel_nl_ops[] = {25static 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 },
21 {33 {
22 .cmd = DEV_ENERGYMODEL_CMD_GET_PERF_DOMAINS,34 .cmd = DEV_ENERGYMODEL_CMD_GET_PERF_DOMAINS,
23 .doit = dev_energymodel_nl_get_perf_domains_doit,35 .dumpit = dev_energymodel_nl_get_perf_domains_dumpit,
24 .flags = GENL_CMD_CAP_DO,36 .flags = GENL_CMD_CAP_DUMP,
25 },37 },
26 {38 {
27 .cmd = DEV_ENERGYMODEL_CMD_GET_PERF_TABLE,39 .cmd = DEV_ENERGYMODEL_CMD_GET_PERF_TABLE,
kernel/power/em_netlink_autogen.h+2−0
@@ -14,6 +14,8 @@ · 13 unmodified lines
14 14
15int dev_energymodel_nl_get_perf_domains_doit(struct sk_buff *skb,15int dev_energymodel_nl_get_perf_domains_doit(struct sk_buff *skb,
16 struct genl_info *info);16 struct genl_info *info);
17int dev_energymodel_nl_get_perf_domains_dumpit(struct sk_buff *skb,
18 struct netlink_callback *cb);
17int dev_energymodel_nl_get_perf_table_doit(struct sk_buff *skb,19int dev_energymodel_nl_get_perf_table_doit(struct sk_buff *skb,
18 struct genl_info *info);20 struct genl_info *info);
19 21