diff options
author | Glauber Costa <glommer@parallels.com> | 2011-12-11 16:47:07 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-12-12 19:04:11 -0500 |
commit | 5a6dd343770d2ae2c25f7a4b1998c091e6252f42 (patch) | |
tree | 2675741dd0e09d0099502da36cfb06a7b63dc746 /net/ipv4 | |
parent | 3aaabe2342c36bf48567b88fa78b819eee14bb5e (diff) |
Display current tcp memory allocation in kmem cgroup
This patch introduces kmem.tcp.usage_in_bytes file, living in the
kmem_cgroup filesystem. It is a simple read-only file that displays the
amount of kernel memory currently consumed by the cgroup.
Signed-off-by: Glauber Costa <glommer@parallels.com>
Reviewed-by: Hiroyouki Kamezawa <kamezawa.hiroyu@jp.fujitsu.com>
CC: David S. Miller <davem@davemloft.net>
CC: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4')
-rw-r--r-- | net/ipv4/tcp_memcontrol.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/net/ipv4/tcp_memcontrol.c b/net/ipv4/tcp_memcontrol.c index e3533903409d..9481f235803e 100644 --- a/net/ipv4/tcp_memcontrol.c +++ b/net/ipv4/tcp_memcontrol.c | |||
@@ -17,6 +17,11 @@ static struct cftype tcp_files[] = { | |||
17 | .read_u64 = tcp_cgroup_read, | 17 | .read_u64 = tcp_cgroup_read, |
18 | .private = RES_LIMIT, | 18 | .private = RES_LIMIT, |
19 | }, | 19 | }, |
20 | { | ||
21 | .name = "kmem.tcp.usage_in_bytes", | ||
22 | .read_u64 = tcp_cgroup_read, | ||
23 | .private = RES_USAGE, | ||
24 | }, | ||
20 | }; | 25 | }; |
21 | 26 | ||
22 | static inline struct tcp_memcontrol *tcp_from_cgproto(struct cg_proto *cg_proto) | 27 | static inline struct tcp_memcontrol *tcp_from_cgproto(struct cg_proto *cg_proto) |
@@ -167,6 +172,19 @@ static u64 tcp_read_stat(struct mem_cgroup *memcg, int type, u64 default_val) | |||
167 | return res_counter_read_u64(&tcp->tcp_memory_allocated, type); | 172 | return res_counter_read_u64(&tcp->tcp_memory_allocated, type); |
168 | } | 173 | } |
169 | 174 | ||
175 | static u64 tcp_read_usage(struct mem_cgroup *memcg) | ||
176 | { | ||
177 | struct tcp_memcontrol *tcp; | ||
178 | struct cg_proto *cg_proto; | ||
179 | |||
180 | cg_proto = tcp_prot.proto_cgroup(memcg); | ||
181 | if (!cg_proto) | ||
182 | return atomic_long_read(&tcp_memory_allocated) << PAGE_SHIFT; | ||
183 | |||
184 | tcp = tcp_from_cgproto(cg_proto); | ||
185 | return res_counter_read_u64(&tcp->tcp_memory_allocated, RES_USAGE); | ||
186 | } | ||
187 | |||
170 | static u64 tcp_cgroup_read(struct cgroup *cont, struct cftype *cft) | 188 | static u64 tcp_cgroup_read(struct cgroup *cont, struct cftype *cft) |
171 | { | 189 | { |
172 | struct mem_cgroup *memcg = mem_cgroup_from_cont(cont); | 190 | struct mem_cgroup *memcg = mem_cgroup_from_cont(cont); |
@@ -176,6 +194,9 @@ static u64 tcp_cgroup_read(struct cgroup *cont, struct cftype *cft) | |||
176 | case RES_LIMIT: | 194 | case RES_LIMIT: |
177 | val = tcp_read_stat(memcg, RES_LIMIT, RESOURCE_MAX); | 195 | val = tcp_read_stat(memcg, RES_LIMIT, RESOURCE_MAX); |
178 | break; | 196 | break; |
197 | case RES_USAGE: | ||
198 | val = tcp_read_usage(memcg); | ||
199 | break; | ||
179 | default: | 200 | default: |
180 | BUG(); | 201 | BUG(); |
181 | } | 202 | } |