diff options
author | Tejun Heo <tj@kernel.org> | 2013-08-08 20:11:22 -0400 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2013-08-08 20:11:22 -0400 |
commit | 6d37b97428d20a21ffc39ba90e97e91e2a79a986 (patch) | |
tree | 0ccfe669f4b04f814776b5293b05f0655558f777 | |
parent | c9710d8018273b0740e0794858f1961fcea5e61a (diff) |
netprio_cgroup: pass around @css instead of @cgroup and kill struct cgroup_netprio_state
cgroup controller API will be converted to primarily use struct
cgroup_subsys_state instead of struct cgroup. In preparation, make
the internal functions of netprio_cgroup pass around @css instead of
@cgrp.
While at it, kill struct cgroup_netprio_state which only contained
struct cgroup_subsys_state without serving any purpose. All functions
are converted to deal with @css directly.
This patch shouldn't cause any behavior differences.
Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: Li Zefan <lizefan@huawei.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | include/net/netprio_cgroup.h | 4 | ||||
-rw-r--r-- | net/core/netprio_cgroup.c | 56 |
2 files changed, 28 insertions, 32 deletions
diff --git a/include/net/netprio_cgroup.h b/include/net/netprio_cgroup.h index 8110fa7ae60a..a24f8bb3ca47 100644 --- a/include/net/netprio_cgroup.h +++ b/include/net/netprio_cgroup.h | |||
@@ -25,10 +25,6 @@ struct netprio_map { | |||
25 | u32 priomap[]; | 25 | u32 priomap[]; |
26 | }; | 26 | }; |
27 | 27 | ||
28 | struct cgroup_netprio_state { | ||
29 | struct cgroup_subsys_state css; | ||
30 | }; | ||
31 | |||
32 | extern void sock_update_netprioidx(struct sock *sk); | 28 | extern void sock_update_netprioidx(struct sock *sk); |
33 | 29 | ||
34 | #if IS_BUILTIN(CONFIG_NETPRIO_CGROUP) | 30 | #if IS_BUILTIN(CONFIG_NETPRIO_CGROUP) |
diff --git a/net/core/netprio_cgroup.c b/net/core/netprio_cgroup.c index ccf852311987..5dfac8886e12 100644 --- a/net/core/netprio_cgroup.c +++ b/net/core/netprio_cgroup.c | |||
@@ -29,12 +29,6 @@ | |||
29 | 29 | ||
30 | #define PRIOMAP_MIN_SZ 128 | 30 | #define PRIOMAP_MIN_SZ 128 |
31 | 31 | ||
32 | static inline struct cgroup_netprio_state *cgrp_netprio_state(struct cgroup *cgrp) | ||
33 | { | ||
34 | return container_of(cgroup_css(cgrp, net_prio_subsys_id), | ||
35 | struct cgroup_netprio_state, css); | ||
36 | } | ||
37 | |||
38 | /* | 32 | /* |
39 | * Extend @dev->priomap so that it's large enough to accomodate | 33 | * Extend @dev->priomap so that it's large enough to accomodate |
40 | * @target_idx. @dev->priomap.priomap_len > @target_idx after successful | 34 | * @target_idx. @dev->priomap.priomap_len > @target_idx after successful |
@@ -87,68 +81,72 @@ static int extend_netdev_table(struct net_device *dev, u32 target_idx) | |||
87 | 81 | ||
88 | /** | 82 | /** |
89 | * netprio_prio - return the effective netprio of a cgroup-net_device pair | 83 | * netprio_prio - return the effective netprio of a cgroup-net_device pair |
90 | * @cgrp: cgroup part of the target pair | 84 | * @css: css part of the target pair |
91 | * @dev: net_device part of the target pair | 85 | * @dev: net_device part of the target pair |
92 | * | 86 | * |
93 | * Should be called under RCU read or rtnl lock. | 87 | * Should be called under RCU read or rtnl lock. |
94 | */ | 88 | */ |
95 | static u32 netprio_prio(struct cgroup *cgrp, struct net_device *dev) | 89 | static u32 netprio_prio(struct cgroup_subsys_state *css, struct net_device *dev) |
96 | { | 90 | { |
97 | struct netprio_map *map = rcu_dereference_rtnl(dev->priomap); | 91 | struct netprio_map *map = rcu_dereference_rtnl(dev->priomap); |
92 | int id = css->cgroup->id; | ||
98 | 93 | ||
99 | if (map && cgrp->id < map->priomap_len) | 94 | if (map && id < map->priomap_len) |
100 | return map->priomap[cgrp->id]; | 95 | return map->priomap[id]; |
101 | return 0; | 96 | return 0; |
102 | } | 97 | } |
103 | 98 | ||
104 | /** | 99 | /** |
105 | * netprio_set_prio - set netprio on a cgroup-net_device pair | 100 | * netprio_set_prio - set netprio on a cgroup-net_device pair |
106 | * @cgrp: cgroup part of the target pair | 101 | * @css: css part of the target pair |
107 | * @dev: net_device part of the target pair | 102 | * @dev: net_device part of the target pair |
108 | * @prio: prio to set | 103 | * @prio: prio to set |
109 | * | 104 | * |
110 | * Set netprio to @prio on @cgrp-@dev pair. Should be called under rtnl | 105 | * Set netprio to @prio on @css-@dev pair. Should be called under rtnl |
111 | * lock and may fail under memory pressure for non-zero @prio. | 106 | * lock and may fail under memory pressure for non-zero @prio. |
112 | */ | 107 | */ |
113 | static int netprio_set_prio(struct cgroup *cgrp, struct net_device *dev, | 108 | static int netprio_set_prio(struct cgroup_subsys_state *css, |
114 | u32 prio) | 109 | struct net_device *dev, u32 prio) |
115 | { | 110 | { |
116 | struct netprio_map *map; | 111 | struct netprio_map *map; |
112 | int id = css->cgroup->id; | ||
117 | int ret; | 113 | int ret; |
118 | 114 | ||
119 | /* avoid extending priomap for zero writes */ | 115 | /* avoid extending priomap for zero writes */ |
120 | map = rtnl_dereference(dev->priomap); | 116 | map = rtnl_dereference(dev->priomap); |
121 | if (!prio && (!map || map->priomap_len <= cgrp->id)) | 117 | if (!prio && (!map || map->priomap_len <= id)) |
122 | return 0; | 118 | return 0; |
123 | 119 | ||
124 | ret = extend_netdev_table(dev, cgrp->id); | 120 | ret = extend_netdev_table(dev, id); |
125 | if (ret) | 121 | if (ret) |
126 | return ret; | 122 | return ret; |
127 | 123 | ||
128 | map = rtnl_dereference(dev->priomap); | 124 | map = rtnl_dereference(dev->priomap); |
129 | map->priomap[cgrp->id] = prio; | 125 | map->priomap[id] = prio; |
130 | return 0; | 126 | return 0; |
131 | } | 127 | } |
132 | 128 | ||
133 | static struct cgroup_subsys_state *cgrp_css_alloc(struct cgroup *cgrp) | 129 | static struct cgroup_subsys_state *cgrp_css_alloc(struct cgroup *cgrp) |
134 | { | 130 | { |
135 | struct cgroup_netprio_state *cs; | 131 | struct cgroup_subsys_state *css; |
136 | 132 | ||
137 | cs = kzalloc(sizeof(*cs), GFP_KERNEL); | 133 | css = kzalloc(sizeof(*css), GFP_KERNEL); |
138 | if (!cs) | 134 | if (!css) |
139 | return ERR_PTR(-ENOMEM); | 135 | return ERR_PTR(-ENOMEM); |
140 | 136 | ||
141 | return &cs->css; | 137 | return css; |
142 | } | 138 | } |
143 | 139 | ||
144 | static int cgrp_css_online(struct cgroup *cgrp) | 140 | static int cgrp_css_online(struct cgroup *cgrp) |
145 | { | 141 | { |
146 | struct cgroup *parent = cgrp->parent; | 142 | struct cgroup_subsys_state *css = cgroup_css(cgrp, net_prio_subsys_id); |
143 | struct cgroup_subsys_state *parent_css; | ||
147 | struct net_device *dev; | 144 | struct net_device *dev; |
148 | int ret = 0; | 145 | int ret = 0; |
149 | 146 | ||
150 | if (!parent) | 147 | if (!cgrp->parent) |
151 | return 0; | 148 | return 0; |
149 | parent_css = cgroup_css(cgrp->parent, net_prio_subsys_id); | ||
152 | 150 | ||
153 | rtnl_lock(); | 151 | rtnl_lock(); |
154 | /* | 152 | /* |
@@ -156,9 +154,9 @@ static int cgrp_css_online(struct cgroup *cgrp) | |||
156 | * onlining, there is no need to clear them on offline. | 154 | * onlining, there is no need to clear them on offline. |
157 | */ | 155 | */ |
158 | for_each_netdev(&init_net, dev) { | 156 | for_each_netdev(&init_net, dev) { |
159 | u32 prio = netprio_prio(parent, dev); | 157 | u32 prio = netprio_prio(parent_css, dev); |
160 | 158 | ||
161 | ret = netprio_set_prio(cgrp, dev, prio); | 159 | ret = netprio_set_prio(css, dev, prio); |
162 | if (ret) | 160 | if (ret) |
163 | break; | 161 | break; |
164 | } | 162 | } |
@@ -168,7 +166,7 @@ static int cgrp_css_online(struct cgroup *cgrp) | |||
168 | 166 | ||
169 | static void cgrp_css_free(struct cgroup *cgrp) | 167 | static void cgrp_css_free(struct cgroup *cgrp) |
170 | { | 168 | { |
171 | kfree(cgrp_netprio_state(cgrp)); | 169 | kfree(cgroup_css(cgrp, net_prio_subsys_id)); |
172 | } | 170 | } |
173 | 171 | ||
174 | static u64 read_prioidx(struct cgroup *cgrp, struct cftype *cft) | 172 | static u64 read_prioidx(struct cgroup *cgrp, struct cftype *cft) |
@@ -179,11 +177,12 @@ static u64 read_prioidx(struct cgroup *cgrp, struct cftype *cft) | |||
179 | static int read_priomap(struct cgroup *cont, struct cftype *cft, | 177 | static int read_priomap(struct cgroup *cont, struct cftype *cft, |
180 | struct cgroup_map_cb *cb) | 178 | struct cgroup_map_cb *cb) |
181 | { | 179 | { |
180 | struct cgroup_subsys_state *css = cgroup_css(cont, net_prio_subsys_id); | ||
182 | struct net_device *dev; | 181 | struct net_device *dev; |
183 | 182 | ||
184 | rcu_read_lock(); | 183 | rcu_read_lock(); |
185 | for_each_netdev_rcu(&init_net, dev) | 184 | for_each_netdev_rcu(&init_net, dev) |
186 | cb->fill(cb, dev->name, netprio_prio(cont, dev)); | 185 | cb->fill(cb, dev->name, netprio_prio(css, dev)); |
187 | rcu_read_unlock(); | 186 | rcu_read_unlock(); |
188 | return 0; | 187 | return 0; |
189 | } | 188 | } |
@@ -191,6 +190,7 @@ static int read_priomap(struct cgroup *cont, struct cftype *cft, | |||
191 | static int write_priomap(struct cgroup *cgrp, struct cftype *cft, | 190 | static int write_priomap(struct cgroup *cgrp, struct cftype *cft, |
192 | const char *buffer) | 191 | const char *buffer) |
193 | { | 192 | { |
193 | struct cgroup_subsys_state *css = cgroup_css(cgrp, net_prio_subsys_id); | ||
194 | char devname[IFNAMSIZ + 1]; | 194 | char devname[IFNAMSIZ + 1]; |
195 | struct net_device *dev; | 195 | struct net_device *dev; |
196 | u32 prio; | 196 | u32 prio; |
@@ -205,7 +205,7 @@ static int write_priomap(struct cgroup *cgrp, struct cftype *cft, | |||
205 | 205 | ||
206 | rtnl_lock(); | 206 | rtnl_lock(); |
207 | 207 | ||
208 | ret = netprio_set_prio(cgrp, dev, prio); | 208 | ret = netprio_set_prio(css, dev, prio); |
209 | 209 | ||
210 | rtnl_unlock(); | 210 | rtnl_unlock(); |
211 | dev_put(dev); | 211 | dev_put(dev); |