aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-05-22 20:40:19 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2012-05-22 20:40:19 -0400
commit88d6ae8dc33af12fe1c7941b1fae2767374046fd (patch)
tree8f17415c0722b0a4d7511ac170cfb4e3802e1ad2 /net
parentf5c101892fbd3d2f6d2729bc7eb7b3f6c31dbddd (diff)
parent0d4dde1ac9a5af74ac76c6ab90557d1ae7b8f5d8 (diff)
Merge branch 'for-3.5' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup
Pull cgroup updates from Tejun Heo: "cgroup file type addition / removal is updated so that file types are added and removed instead of individual files so that dynamic file type addition / removal can be implemented by cgroup and used by controllers. blkio controller changes which will come through block tree are dependent on this. Other changes include res_counter cleanup and disallowing kthread / PF_THREAD_BOUND threads to be attached to non-root cgroups. There's a reported bug with the file type addition / removal handling which can lead to oops on cgroup umount. The issue is being looked into. It shouldn't cause problems for most setups and isn't a security concern." Fix up trivial conflict in Documentation/feature-removal-schedule.txt * 'for-3.5' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup: (21 commits) res_counter: Account max_usage when calling res_counter_charge_nofail() res_counter: Merge res_counter_charge and res_counter_charge_nofail cgroups: disallow attaching kthreadd or PF_THREAD_BOUND threads cgroup: remove cgroup_subsys->populate() cgroup: get rid of populate for memcg cgroup: pass struct mem_cgroup instead of struct cgroup to socket memcg cgroup: make css->refcnt clearing on cgroup removal optional cgroup: use negative bias on css->refcnt to block css_tryget() cgroup: implement cgroup_rm_cftypes() cgroup: introduce struct cfent cgroup: relocate __d_cgrp() and __d_cft() cgroup: remove cgroup_add_file[s]() cgroup: convert memcg controller to the new cftype interface memcg: always create memsw files if CONFIG_CGROUP_MEM_RES_CTLR_SWAP cgroup: convert all non-memcg controllers to the new cftype interface cgroup: relocate cftype and cgroup_subsys definitions in controllers cgroup: merge cft_release_agent cftype array into the base files array cgroup: implement cgroup_add_cftypes() and friends cgroup: build list of all cgroups under a given cgroupfs_root cgroup: move cgroup_clear_directory() call out of cgroup_populate_dir() ...
Diffstat (limited to 'net')
-rw-r--r--net/core/netprio_cgroup.c30
-rw-r--r--net/core/sock.c10
-rw-r--r--net/ipv4/tcp_memcontrol.c77
-rw-r--r--net/sched/cls_cgroup.c31
4 files changed, 65 insertions, 83 deletions
diff --git a/net/core/netprio_cgroup.c b/net/core/netprio_cgroup.c
index 09eda68b6763..5b8aa2fae48b 100644
--- a/net/core/netprio_cgroup.c
+++ b/net/core/netprio_cgroup.c
@@ -25,21 +25,6 @@
25#include <net/sock.h> 25#include <net/sock.h>
26#include <net/netprio_cgroup.h> 26#include <net/netprio_cgroup.h>
27 27
28static struct cgroup_subsys_state *cgrp_create(struct cgroup *cgrp);
29static void cgrp_destroy(struct cgroup *cgrp);
30static int cgrp_populate(struct cgroup_subsys *ss, struct cgroup *cgrp);
31
32struct cgroup_subsys net_prio_subsys = {
33 .name = "net_prio",
34 .create = cgrp_create,
35 .destroy = cgrp_destroy,
36 .populate = cgrp_populate,
37#ifdef CONFIG_NETPRIO_CGROUP
38 .subsys_id = net_prio_subsys_id,
39#endif
40 .module = THIS_MODULE
41};
42
43#define PRIOIDX_SZ 128 28#define PRIOIDX_SZ 128
44 29
45static unsigned long prioidx_map[PRIOIDX_SZ]; 30static unsigned long prioidx_map[PRIOIDX_SZ];
@@ -259,12 +244,19 @@ static struct cftype ss_files[] = {
259 .read_map = read_priomap, 244 .read_map = read_priomap,
260 .write_string = write_priomap, 245 .write_string = write_priomap,
261 }, 246 },
247 { } /* terminate */
262}; 248};
263 249
264static int cgrp_populate(struct cgroup_subsys *ss, struct cgroup *cgrp) 250struct cgroup_subsys net_prio_subsys = {
265{ 251 .name = "net_prio",
266 return cgroup_add_files(cgrp, ss, ss_files, ARRAY_SIZE(ss_files)); 252 .create = cgrp_create,
267} 253 .destroy = cgrp_destroy,
254#ifdef CONFIG_NETPRIO_CGROUP
255 .subsys_id = net_prio_subsys_id,
256#endif
257 .base_cftypes = ss_files,
258 .module = THIS_MODULE
259};
268 260
269static int netprio_device_event(struct notifier_block *unused, 261static int netprio_device_event(struct notifier_block *unused,
270 unsigned long event, void *ptr) 262 unsigned long event, void *ptr)
diff --git a/net/core/sock.c b/net/core/sock.c
index 5efcd6307fa7..f372d9bf4976 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -143,7 +143,7 @@ static DEFINE_MUTEX(proto_list_mutex);
143static LIST_HEAD(proto_list); 143static LIST_HEAD(proto_list);
144 144
145#ifdef CONFIG_CGROUP_MEM_RES_CTLR_KMEM 145#ifdef CONFIG_CGROUP_MEM_RES_CTLR_KMEM
146int mem_cgroup_sockets_init(struct cgroup *cgrp, struct cgroup_subsys *ss) 146int mem_cgroup_sockets_init(struct mem_cgroup *memcg, struct cgroup_subsys *ss)
147{ 147{
148 struct proto *proto; 148 struct proto *proto;
149 int ret = 0; 149 int ret = 0;
@@ -151,7 +151,7 @@ int mem_cgroup_sockets_init(struct cgroup *cgrp, struct cgroup_subsys *ss)
151 mutex_lock(&proto_list_mutex); 151 mutex_lock(&proto_list_mutex);
152 list_for_each_entry(proto, &proto_list, node) { 152 list_for_each_entry(proto, &proto_list, node) {
153 if (proto->init_cgroup) { 153 if (proto->init_cgroup) {
154 ret = proto->init_cgroup(cgrp, ss); 154 ret = proto->init_cgroup(memcg, ss);
155 if (ret) 155 if (ret)
156 goto out; 156 goto out;
157 } 157 }
@@ -162,19 +162,19 @@ int mem_cgroup_sockets_init(struct cgroup *cgrp, struct cgroup_subsys *ss)
162out: 162out:
163 list_for_each_entry_continue_reverse(proto, &proto_list, node) 163 list_for_each_entry_continue_reverse(proto, &proto_list, node)
164 if (proto->destroy_cgroup) 164 if (proto->destroy_cgroup)
165 proto->destroy_cgroup(cgrp); 165 proto->destroy_cgroup(memcg);
166 mutex_unlock(&proto_list_mutex); 166 mutex_unlock(&proto_list_mutex);
167 return ret; 167 return ret;
168} 168}
169 169
170void mem_cgroup_sockets_destroy(struct cgroup *cgrp) 170void mem_cgroup_sockets_destroy(struct mem_cgroup *memcg)
171{ 171{
172 struct proto *proto; 172 struct proto *proto;
173 173
174 mutex_lock(&proto_list_mutex); 174 mutex_lock(&proto_list_mutex);
175 list_for_each_entry_reverse(proto, &proto_list, node) 175 list_for_each_entry_reverse(proto, &proto_list, node)
176 if (proto->destroy_cgroup) 176 if (proto->destroy_cgroup)
177 proto->destroy_cgroup(cgrp); 177 proto->destroy_cgroup(memcg);
178 mutex_unlock(&proto_list_mutex); 178 mutex_unlock(&proto_list_mutex);
179} 179}
180#endif 180#endif
diff --git a/net/ipv4/tcp_memcontrol.c b/net/ipv4/tcp_memcontrol.c
index e795272fbe9e..151703791bb0 100644
--- a/net/ipv4/tcp_memcontrol.c
+++ b/net/ipv4/tcp_memcontrol.c
@@ -6,37 +6,6 @@
6#include <linux/memcontrol.h> 6#include <linux/memcontrol.h>
7#include <linux/module.h> 7#include <linux/module.h>
8 8
9static u64 tcp_cgroup_read(struct cgroup *cont, struct cftype *cft);
10static int tcp_cgroup_write(struct cgroup *cont, struct cftype *cft,
11 const char *buffer);
12static int tcp_cgroup_reset(struct cgroup *cont, unsigned int event);
13
14static struct cftype tcp_files[] = {
15 {
16 .name = "kmem.tcp.limit_in_bytes",
17 .write_string = tcp_cgroup_write,
18 .read_u64 = tcp_cgroup_read,
19 .private = RES_LIMIT,
20 },
21 {
22 .name = "kmem.tcp.usage_in_bytes",
23 .read_u64 = tcp_cgroup_read,
24 .private = RES_USAGE,
25 },
26 {
27 .name = "kmem.tcp.failcnt",
28 .private = RES_FAILCNT,
29 .trigger = tcp_cgroup_reset,
30 .read_u64 = tcp_cgroup_read,
31 },
32 {
33 .name = "kmem.tcp.max_usage_in_bytes",
34 .private = RES_MAX_USAGE,
35 .trigger = tcp_cgroup_reset,
36 .read_u64 = tcp_cgroup_read,
37 },
38};
39
40static inline struct tcp_memcontrol *tcp_from_cgproto(struct cg_proto *cg_proto) 9static inline struct tcp_memcontrol *tcp_from_cgproto(struct cg_proto *cg_proto)
41{ 10{
42 return container_of(cg_proto, struct tcp_memcontrol, cg_proto); 11 return container_of(cg_proto, struct tcp_memcontrol, cg_proto);
@@ -49,7 +18,7 @@ static void memcg_tcp_enter_memory_pressure(struct sock *sk)
49} 18}
50EXPORT_SYMBOL(memcg_tcp_enter_memory_pressure); 19EXPORT_SYMBOL(memcg_tcp_enter_memory_pressure);
51 20
52int tcp_init_cgroup(struct cgroup *cgrp, struct cgroup_subsys *ss) 21int tcp_init_cgroup(struct mem_cgroup *memcg, struct cgroup_subsys *ss)
53{ 22{
54 /* 23 /*
55 * The root cgroup does not use res_counters, but rather, 24 * The root cgroup does not use res_counters, but rather,
@@ -59,13 +28,12 @@ int tcp_init_cgroup(struct cgroup *cgrp, struct cgroup_subsys *ss)
59 struct res_counter *res_parent = NULL; 28 struct res_counter *res_parent = NULL;
60 struct cg_proto *cg_proto, *parent_cg; 29 struct cg_proto *cg_proto, *parent_cg;
61 struct tcp_memcontrol *tcp; 30 struct tcp_memcontrol *tcp;
62 struct mem_cgroup *memcg = mem_cgroup_from_cont(cgrp);
63 struct mem_cgroup *parent = parent_mem_cgroup(memcg); 31 struct mem_cgroup *parent = parent_mem_cgroup(memcg);
64 struct net *net = current->nsproxy->net_ns; 32 struct net *net = current->nsproxy->net_ns;
65 33
66 cg_proto = tcp_prot.proto_cgroup(memcg); 34 cg_proto = tcp_prot.proto_cgroup(memcg);
67 if (!cg_proto) 35 if (!cg_proto)
68 goto create_files; 36 return 0;
69 37
70 tcp = tcp_from_cgproto(cg_proto); 38 tcp = tcp_from_cgproto(cg_proto);
71 39
@@ -88,15 +56,12 @@ int tcp_init_cgroup(struct cgroup *cgrp, struct cgroup_subsys *ss)
88 cg_proto->sockets_allocated = &tcp->tcp_sockets_allocated; 56 cg_proto->sockets_allocated = &tcp->tcp_sockets_allocated;
89 cg_proto->memcg = memcg; 57 cg_proto->memcg = memcg;
90 58
91create_files: 59 return 0;
92 return cgroup_add_files(cgrp, ss, tcp_files,
93 ARRAY_SIZE(tcp_files));
94} 60}
95EXPORT_SYMBOL(tcp_init_cgroup); 61EXPORT_SYMBOL(tcp_init_cgroup);
96 62
97void tcp_destroy_cgroup(struct cgroup *cgrp) 63void tcp_destroy_cgroup(struct mem_cgroup *memcg)
98{ 64{
99 struct mem_cgroup *memcg = mem_cgroup_from_cont(cgrp);
100 struct cg_proto *cg_proto; 65 struct cg_proto *cg_proto;
101 struct tcp_memcontrol *tcp; 66 struct tcp_memcontrol *tcp;
102 u64 val; 67 u64 val;
@@ -270,3 +235,37 @@ void tcp_prot_mem(struct mem_cgroup *memcg, long val, int idx)
270 235
271 tcp->tcp_prot_mem[idx] = val; 236 tcp->tcp_prot_mem[idx] = val;
272} 237}
238
239static struct cftype tcp_files[] = {
240 {
241 .name = "kmem.tcp.limit_in_bytes",
242 .write_string = tcp_cgroup_write,
243 .read_u64 = tcp_cgroup_read,
244 .private = RES_LIMIT,
245 },
246 {
247 .name = "kmem.tcp.usage_in_bytes",
248 .read_u64 = tcp_cgroup_read,
249 .private = RES_USAGE,
250 },
251 {
252 .name = "kmem.tcp.failcnt",
253 .private = RES_FAILCNT,
254 .trigger = tcp_cgroup_reset,
255 .read_u64 = tcp_cgroup_read,
256 },
257 {
258 .name = "kmem.tcp.max_usage_in_bytes",
259 .private = RES_MAX_USAGE,
260 .trigger = tcp_cgroup_reset,
261 .read_u64 = tcp_cgroup_read,
262 },
263 { } /* terminate */
264};
265
266static int __init tcp_memcontrol_init(void)
267{
268 WARN_ON(cgroup_add_cftypes(&mem_cgroup_subsys, tcp_files));
269 return 0;
270}
271__initcall(tcp_memcontrol_init);
diff --git a/net/sched/cls_cgroup.c b/net/sched/cls_cgroup.c
index 1afaa284fcd7..7743ea8d1d38 100644
--- a/net/sched/cls_cgroup.c
+++ b/net/sched/cls_cgroup.c
@@ -22,22 +22,6 @@
22#include <net/sock.h> 22#include <net/sock.h>
23#include <net/cls_cgroup.h> 23#include <net/cls_cgroup.h>
24 24
25static struct cgroup_subsys_state *cgrp_create(struct cgroup *cgrp);
26static void cgrp_destroy(struct cgroup *cgrp);
27static int cgrp_populate(struct cgroup_subsys *ss, struct cgroup *cgrp);
28
29struct cgroup_subsys net_cls_subsys = {
30 .name = "net_cls",
31 .create = cgrp_create,
32 .destroy = cgrp_destroy,
33 .populate = cgrp_populate,
34#ifdef CONFIG_NET_CLS_CGROUP
35 .subsys_id = net_cls_subsys_id,
36#endif
37 .module = THIS_MODULE,
38};
39
40
41static inline struct cgroup_cls_state *cgrp_cls_state(struct cgroup *cgrp) 25static inline struct cgroup_cls_state *cgrp_cls_state(struct cgroup *cgrp)
42{ 26{
43 return container_of(cgroup_subsys_state(cgrp, net_cls_subsys_id), 27 return container_of(cgroup_subsys_state(cgrp, net_cls_subsys_id),
@@ -86,12 +70,19 @@ static struct cftype ss_files[] = {
86 .read_u64 = read_classid, 70 .read_u64 = read_classid,
87 .write_u64 = write_classid, 71 .write_u64 = write_classid,
88 }, 72 },
73 { } /* terminate */
89}; 74};
90 75
91static int cgrp_populate(struct cgroup_subsys *ss, struct cgroup *cgrp) 76struct cgroup_subsys net_cls_subsys = {
92{ 77 .name = "net_cls",
93 return cgroup_add_files(cgrp, ss, ss_files, ARRAY_SIZE(ss_files)); 78 .create = cgrp_create,
94} 79 .destroy = cgrp_destroy,
80#ifdef CONFIG_NET_CLS_CGROUP
81 .subsys_id = net_cls_subsys_id,
82#endif
83 .base_cftypes = ss_files,
84 .module = THIS_MODULE,
85};
95 86
96struct cls_cgroup_head { 87struct cls_cgroup_head {
97 u32 handle; 88 u32 handle;