diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/core/netprio_cgroup.c | 72 | ||||
-rw-r--r-- | net/ipv4/tcp_memcontrol.c | 12 | ||||
-rw-r--r-- | net/sched/cls_cgroup.c | 39 |
3 files changed, 62 insertions, 61 deletions
diff --git a/net/core/netprio_cgroup.c b/net/core/netprio_cgroup.c index e533259dce3c..d9cd627e6a16 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_subsys_state(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,67 +81,70 @@ 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 * |
130 | cgrp_css_alloc(struct cgroup_subsys_state *parent_css) | ||
134 | { | 131 | { |
135 | struct cgroup_netprio_state *cs; | 132 | struct cgroup_subsys_state *css; |
136 | 133 | ||
137 | cs = kzalloc(sizeof(*cs), GFP_KERNEL); | 134 | css = kzalloc(sizeof(*css), GFP_KERNEL); |
138 | if (!cs) | 135 | if (!css) |
139 | return ERR_PTR(-ENOMEM); | 136 | return ERR_PTR(-ENOMEM); |
140 | 137 | ||
141 | return &cs->css; | 138 | return css; |
142 | } | 139 | } |
143 | 140 | ||
144 | static int cgrp_css_online(struct cgroup *cgrp) | 141 | static int cgrp_css_online(struct cgroup_subsys_state *css) |
145 | { | 142 | { |
146 | struct cgroup *parent = cgrp->parent; | 143 | struct cgroup_subsys_state *parent_css = css_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 (!parent_css) |
151 | return 0; | 148 | return 0; |
152 | 149 | ||
153 | rtnl_lock(); | 150 | rtnl_lock(); |
@@ -156,9 +153,9 @@ static int cgrp_css_online(struct cgroup *cgrp) | |||
156 | * onlining, there is no need to clear them on offline. | 153 | * onlining, there is no need to clear them on offline. |
157 | */ | 154 | */ |
158 | for_each_netdev(&init_net, dev) { | 155 | for_each_netdev(&init_net, dev) { |
159 | u32 prio = netprio_prio(parent, dev); | 156 | u32 prio = netprio_prio(parent_css, dev); |
160 | 157 | ||
161 | ret = netprio_set_prio(cgrp, dev, prio); | 158 | ret = netprio_set_prio(css, dev, prio); |
162 | if (ret) | 159 | if (ret) |
163 | break; | 160 | break; |
164 | } | 161 | } |
@@ -166,29 +163,29 @@ static int cgrp_css_online(struct cgroup *cgrp) | |||
166 | return ret; | 163 | return ret; |
167 | } | 164 | } |
168 | 165 | ||
169 | static void cgrp_css_free(struct cgroup *cgrp) | 166 | static void cgrp_css_free(struct cgroup_subsys_state *css) |
170 | { | 167 | { |
171 | kfree(cgrp_netprio_state(cgrp)); | 168 | kfree(css); |
172 | } | 169 | } |
173 | 170 | ||
174 | static u64 read_prioidx(struct cgroup *cgrp, struct cftype *cft) | 171 | static u64 read_prioidx(struct cgroup_subsys_state *css, struct cftype *cft) |
175 | { | 172 | { |
176 | return cgrp->id; | 173 | return css->cgroup->id; |
177 | } | 174 | } |
178 | 175 | ||
179 | static int read_priomap(struct cgroup *cont, struct cftype *cft, | 176 | static int read_priomap(struct cgroup_subsys_state *css, struct cftype *cft, |
180 | struct cgroup_map_cb *cb) | 177 | struct cgroup_map_cb *cb) |
181 | { | 178 | { |
182 | struct net_device *dev; | 179 | struct net_device *dev; |
183 | 180 | ||
184 | rcu_read_lock(); | 181 | rcu_read_lock(); |
185 | for_each_netdev_rcu(&init_net, dev) | 182 | for_each_netdev_rcu(&init_net, dev) |
186 | cb->fill(cb, dev->name, netprio_prio(cont, dev)); | 183 | cb->fill(cb, dev->name, netprio_prio(css, dev)); |
187 | rcu_read_unlock(); | 184 | rcu_read_unlock(); |
188 | return 0; | 185 | return 0; |
189 | } | 186 | } |
190 | 187 | ||
191 | static int write_priomap(struct cgroup *cgrp, struct cftype *cft, | 188 | static int write_priomap(struct cgroup_subsys_state *css, struct cftype *cft, |
192 | const char *buffer) | 189 | const char *buffer) |
193 | { | 190 | { |
194 | char devname[IFNAMSIZ + 1]; | 191 | char devname[IFNAMSIZ + 1]; |
@@ -205,7 +202,7 @@ static int write_priomap(struct cgroup *cgrp, struct cftype *cft, | |||
205 | 202 | ||
206 | rtnl_lock(); | 203 | rtnl_lock(); |
207 | 204 | ||
208 | ret = netprio_set_prio(cgrp, dev, prio); | 205 | ret = netprio_set_prio(css, dev, prio); |
209 | 206 | ||
210 | rtnl_unlock(); | 207 | rtnl_unlock(); |
211 | dev_put(dev); | 208 | dev_put(dev); |
@@ -221,12 +218,13 @@ static int update_netprio(const void *v, struct file *file, unsigned n) | |||
221 | return 0; | 218 | return 0; |
222 | } | 219 | } |
223 | 220 | ||
224 | static void net_prio_attach(struct cgroup *cgrp, struct cgroup_taskset *tset) | 221 | static void net_prio_attach(struct cgroup_subsys_state *css, |
222 | struct cgroup_taskset *tset) | ||
225 | { | 223 | { |
226 | struct task_struct *p; | 224 | struct task_struct *p; |
227 | void *v; | 225 | void *v; |
228 | 226 | ||
229 | cgroup_taskset_for_each(p, cgrp, tset) { | 227 | cgroup_taskset_for_each(p, css, tset) { |
230 | task_lock(p); | 228 | task_lock(p); |
231 | v = (void *)(unsigned long)task_netprioidx(p); | 229 | v = (void *)(unsigned long)task_netprioidx(p); |
232 | iterate_fd(p->files, 0, update_netprio, v); | 230 | iterate_fd(p->files, 0, update_netprio, v); |
diff --git a/net/ipv4/tcp_memcontrol.c b/net/ipv4/tcp_memcontrol.c index da14436c1735..8a57d79b0b16 100644 --- a/net/ipv4/tcp_memcontrol.c +++ b/net/ipv4/tcp_memcontrol.c | |||
@@ -132,10 +132,10 @@ static int tcp_update_limit(struct mem_cgroup *memcg, u64 val) | |||
132 | return 0; | 132 | return 0; |
133 | } | 133 | } |
134 | 134 | ||
135 | static int tcp_cgroup_write(struct cgroup *cont, struct cftype *cft, | 135 | static int tcp_cgroup_write(struct cgroup_subsys_state *css, struct cftype *cft, |
136 | const char *buffer) | 136 | const char *buffer) |
137 | { | 137 | { |
138 | struct mem_cgroup *memcg = mem_cgroup_from_cont(cont); | 138 | struct mem_cgroup *memcg = mem_cgroup_from_css(css); |
139 | unsigned long long val; | 139 | unsigned long long val; |
140 | int ret = 0; | 140 | int ret = 0; |
141 | 141 | ||
@@ -180,9 +180,9 @@ static u64 tcp_read_usage(struct mem_cgroup *memcg) | |||
180 | return res_counter_read_u64(&tcp->tcp_memory_allocated, RES_USAGE); | 180 | return res_counter_read_u64(&tcp->tcp_memory_allocated, RES_USAGE); |
181 | } | 181 | } |
182 | 182 | ||
183 | static u64 tcp_cgroup_read(struct cgroup *cont, struct cftype *cft) | 183 | static u64 tcp_cgroup_read(struct cgroup_subsys_state *css, struct cftype *cft) |
184 | { | 184 | { |
185 | struct mem_cgroup *memcg = mem_cgroup_from_cont(cont); | 185 | struct mem_cgroup *memcg = mem_cgroup_from_css(css); |
186 | u64 val; | 186 | u64 val; |
187 | 187 | ||
188 | switch (cft->private) { | 188 | switch (cft->private) { |
@@ -202,13 +202,13 @@ static u64 tcp_cgroup_read(struct cgroup *cont, struct cftype *cft) | |||
202 | return val; | 202 | return val; |
203 | } | 203 | } |
204 | 204 | ||
205 | static int tcp_cgroup_reset(struct cgroup *cont, unsigned int event) | 205 | static int tcp_cgroup_reset(struct cgroup_subsys_state *css, unsigned int event) |
206 | { | 206 | { |
207 | struct mem_cgroup *memcg; | 207 | struct mem_cgroup *memcg; |
208 | struct tcp_memcontrol *tcp; | 208 | struct tcp_memcontrol *tcp; |
209 | struct cg_proto *cg_proto; | 209 | struct cg_proto *cg_proto; |
210 | 210 | ||
211 | memcg = mem_cgroup_from_cont(cont); | 211 | memcg = mem_cgroup_from_css(css); |
212 | cg_proto = tcp_prot.proto_cgroup(memcg); | 212 | cg_proto = tcp_prot.proto_cgroup(memcg); |
213 | if (!cg_proto) | 213 | if (!cg_proto) |
214 | return 0; | 214 | return 0; |
diff --git a/net/sched/cls_cgroup.c b/net/sched/cls_cgroup.c index 3a294eb98d61..867b4a3e3980 100644 --- a/net/sched/cls_cgroup.c +++ b/net/sched/cls_cgroup.c | |||
@@ -23,19 +23,18 @@ | |||
23 | #include <net/sock.h> | 23 | #include <net/sock.h> |
24 | #include <net/cls_cgroup.h> | 24 | #include <net/cls_cgroup.h> |
25 | 25 | ||
26 | static inline struct cgroup_cls_state *cgrp_cls_state(struct cgroup *cgrp) | 26 | static inline struct cgroup_cls_state *css_cls_state(struct cgroup_subsys_state *css) |
27 | { | 27 | { |
28 | return container_of(cgroup_subsys_state(cgrp, net_cls_subsys_id), | 28 | return css ? container_of(css, struct cgroup_cls_state, css) : NULL; |
29 | struct cgroup_cls_state, css); | ||
30 | } | 29 | } |
31 | 30 | ||
32 | static inline struct cgroup_cls_state *task_cls_state(struct task_struct *p) | 31 | static inline struct cgroup_cls_state *task_cls_state(struct task_struct *p) |
33 | { | 32 | { |
34 | return container_of(task_subsys_state(p, net_cls_subsys_id), | 33 | return css_cls_state(task_css(p, net_cls_subsys_id)); |
35 | struct cgroup_cls_state, css); | ||
36 | } | 34 | } |
37 | 35 | ||
38 | static struct cgroup_subsys_state *cgrp_css_alloc(struct cgroup *cgrp) | 36 | static struct cgroup_subsys_state * |
37 | cgrp_css_alloc(struct cgroup_subsys_state *parent_css) | ||
39 | { | 38 | { |
40 | struct cgroup_cls_state *cs; | 39 | struct cgroup_cls_state *cs; |
41 | 40 | ||
@@ -45,17 +44,19 @@ static struct cgroup_subsys_state *cgrp_css_alloc(struct cgroup *cgrp) | |||
45 | return &cs->css; | 44 | return &cs->css; |
46 | } | 45 | } |
47 | 46 | ||
48 | static int cgrp_css_online(struct cgroup *cgrp) | 47 | static int cgrp_css_online(struct cgroup_subsys_state *css) |
49 | { | 48 | { |
50 | if (cgrp->parent) | 49 | struct cgroup_cls_state *cs = css_cls_state(css); |
51 | cgrp_cls_state(cgrp)->classid = | 50 | struct cgroup_cls_state *parent = css_cls_state(css_parent(css)); |
52 | cgrp_cls_state(cgrp->parent)->classid; | 51 | |
52 | if (parent) | ||
53 | cs->classid = parent->classid; | ||
53 | return 0; | 54 | return 0; |
54 | } | 55 | } |
55 | 56 | ||
56 | static void cgrp_css_free(struct cgroup *cgrp) | 57 | static void cgrp_css_free(struct cgroup_subsys_state *css) |
57 | { | 58 | { |
58 | kfree(cgrp_cls_state(cgrp)); | 59 | kfree(css_cls_state(css)); |
59 | } | 60 | } |
60 | 61 | ||
61 | static int update_classid(const void *v, struct file *file, unsigned n) | 62 | static int update_classid(const void *v, struct file *file, unsigned n) |
@@ -67,12 +68,13 @@ static int update_classid(const void *v, struct file *file, unsigned n) | |||
67 | return 0; | 68 | return 0; |
68 | } | 69 | } |
69 | 70 | ||
70 | static void cgrp_attach(struct cgroup *cgrp, struct cgroup_taskset *tset) | 71 | static void cgrp_attach(struct cgroup_subsys_state *css, |
72 | struct cgroup_taskset *tset) | ||
71 | { | 73 | { |
72 | struct task_struct *p; | 74 | struct task_struct *p; |
73 | void *v; | 75 | void *v; |
74 | 76 | ||
75 | cgroup_taskset_for_each(p, cgrp, tset) { | 77 | cgroup_taskset_for_each(p, css, tset) { |
76 | task_lock(p); | 78 | task_lock(p); |
77 | v = (void *)(unsigned long)task_cls_classid(p); | 79 | v = (void *)(unsigned long)task_cls_classid(p); |
78 | iterate_fd(p->files, 0, update_classid, v); | 80 | iterate_fd(p->files, 0, update_classid, v); |
@@ -80,14 +82,15 @@ static void cgrp_attach(struct cgroup *cgrp, struct cgroup_taskset *tset) | |||
80 | } | 82 | } |
81 | } | 83 | } |
82 | 84 | ||
83 | static u64 read_classid(struct cgroup *cgrp, struct cftype *cft) | 85 | static u64 read_classid(struct cgroup_subsys_state *css, struct cftype *cft) |
84 | { | 86 | { |
85 | return cgrp_cls_state(cgrp)->classid; | 87 | return css_cls_state(css)->classid; |
86 | } | 88 | } |
87 | 89 | ||
88 | static int write_classid(struct cgroup *cgrp, struct cftype *cft, u64 value) | 90 | static int write_classid(struct cgroup_subsys_state *css, struct cftype *cft, |
91 | u64 value) | ||
89 | { | 92 | { |
90 | cgrp_cls_state(cgrp)->classid = (u32) value; | 93 | css_cls_state(css)->classid = (u32) value; |
91 | return 0; | 94 | return 0; |
92 | } | 95 | } |
93 | 96 | ||