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