2 #include <net/tcp_memcontrol.h>
5 #include <linux/nsproxy.h>
6 #include <linux/memcontrol.h>
7 #include <linux/module.h>
9 static u64 tcp_cgroup_read(struct cgroup *cont, struct cftype *cft);
10 static int tcp_cgroup_write(struct cgroup *cont, struct cftype *cft,
13 static struct cftype tcp_files[] = {
15 .name = "kmem.tcp.limit_in_bytes",
16 .write_string = tcp_cgroup_write,
17 .read_u64 = tcp_cgroup_read,
22 static inline struct tcp_memcontrol *tcp_from_cgproto(struct cg_proto *cg_proto)
24 return container_of(cg_proto, struct tcp_memcontrol, cg_proto);
27 static void memcg_tcp_enter_memory_pressure(struct sock *sk)
29 if (!sk->sk_cgrp->memory_pressure)
30 *sk->sk_cgrp->memory_pressure = 1;
32 EXPORT_SYMBOL(memcg_tcp_enter_memory_pressure);
34 int tcp_init_cgroup(struct cgroup *cgrp, struct cgroup_subsys *ss)
37 * The root cgroup does not use res_counters, but rather,
38 * rely on the data already collected by the network
41 struct res_counter *res_parent = NULL;
42 struct cg_proto *cg_proto, *parent_cg;
43 struct tcp_memcontrol *tcp;
44 struct mem_cgroup *memcg = mem_cgroup_from_cont(cgrp);
45 struct mem_cgroup *parent = parent_mem_cgroup(memcg);
46 struct net *net = current->nsproxy->net_ns;
48 cg_proto = tcp_prot.proto_cgroup(memcg);
52 tcp = tcp_from_cgproto(cg_proto);
54 tcp->tcp_prot_mem[0] = net->ipv4.sysctl_tcp_mem[0];
55 tcp->tcp_prot_mem[1] = net->ipv4.sysctl_tcp_mem[1];
56 tcp->tcp_prot_mem[2] = net->ipv4.sysctl_tcp_mem[2];
57 tcp->tcp_memory_pressure = 0;
59 parent_cg = tcp_prot.proto_cgroup(parent);
61 res_parent = parent_cg->memory_allocated;
63 res_counter_init(&tcp->tcp_memory_allocated, res_parent);
64 percpu_counter_init(&tcp->tcp_sockets_allocated, 0);
66 cg_proto->enter_memory_pressure = memcg_tcp_enter_memory_pressure;
67 cg_proto->memory_pressure = &tcp->tcp_memory_pressure;
68 cg_proto->sysctl_mem = tcp->tcp_prot_mem;
69 cg_proto->memory_allocated = &tcp->tcp_memory_allocated;
70 cg_proto->sockets_allocated = &tcp->tcp_sockets_allocated;
71 cg_proto->memcg = memcg;
74 return cgroup_add_files(cgrp, ss, tcp_files,
75 ARRAY_SIZE(tcp_files));
77 EXPORT_SYMBOL(tcp_init_cgroup);
79 void tcp_destroy_cgroup(struct cgroup *cgrp, struct cgroup_subsys *ss)
81 struct mem_cgroup *memcg = mem_cgroup_from_cont(cgrp);
82 struct cg_proto *cg_proto;
83 struct tcp_memcontrol *tcp;
86 cg_proto = tcp_prot.proto_cgroup(memcg);
90 tcp = tcp_from_cgproto(cg_proto);
91 percpu_counter_destroy(&tcp->tcp_sockets_allocated);
93 val = res_counter_read_u64(&tcp->tcp_memory_allocated, RES_USAGE);
95 if (val != RESOURCE_MAX)
96 jump_label_dec(&memcg_socket_limit_enabled);
98 EXPORT_SYMBOL(tcp_destroy_cgroup);
100 static int tcp_update_limit(struct mem_cgroup *memcg, u64 val)
102 struct net *net = current->nsproxy->net_ns;
103 struct tcp_memcontrol *tcp;
104 struct cg_proto *cg_proto;
109 cg_proto = tcp_prot.proto_cgroup(memcg);
113 if (val > RESOURCE_MAX)
116 tcp = tcp_from_cgproto(cg_proto);
118 old_lim = res_counter_read_u64(&tcp->tcp_memory_allocated, RES_LIMIT);
119 ret = res_counter_set_limit(&tcp->tcp_memory_allocated, val);
123 for (i = 0; i < 3; i++)
124 tcp->tcp_prot_mem[i] = min_t(long, val >> PAGE_SHIFT,
125 net->ipv4.sysctl_tcp_mem[i]);
127 if (val == RESOURCE_MAX && old_lim != RESOURCE_MAX)
128 jump_label_dec(&memcg_socket_limit_enabled);
129 else if (old_lim == RESOURCE_MAX && val != RESOURCE_MAX)
130 jump_label_inc(&memcg_socket_limit_enabled);
135 static int tcp_cgroup_write(struct cgroup *cont, struct cftype *cft,
138 struct mem_cgroup *memcg = mem_cgroup_from_cont(cont);
139 unsigned long long val;
142 switch (cft->private) {
144 /* see memcontrol.c */
145 ret = res_counter_memparse_write_strategy(buffer, &val);
148 ret = tcp_update_limit(memcg, val);
157 static u64 tcp_read_stat(struct mem_cgroup *memcg, int type, u64 default_val)
159 struct tcp_memcontrol *tcp;
160 struct cg_proto *cg_proto;
162 cg_proto = tcp_prot.proto_cgroup(memcg);
166 tcp = tcp_from_cgproto(cg_proto);
167 return res_counter_read_u64(&tcp->tcp_memory_allocated, type);
170 static u64 tcp_cgroup_read(struct cgroup *cont, struct cftype *cft)
172 struct mem_cgroup *memcg = mem_cgroup_from_cont(cont);
175 switch (cft->private) {
177 val = tcp_read_stat(memcg, RES_LIMIT, RESOURCE_MAX);
185 unsigned long long tcp_max_memory(const struct mem_cgroup *memcg)
187 struct tcp_memcontrol *tcp;
188 struct cg_proto *cg_proto;
190 cg_proto = tcp_prot.proto_cgroup((struct mem_cgroup *)memcg);
194 tcp = tcp_from_cgproto(cg_proto);
195 return res_counter_read_u64(&tcp->tcp_memory_allocated, RES_LIMIT);
198 void tcp_prot_mem(struct mem_cgroup *memcg, long val, int idx)
200 struct tcp_memcontrol *tcp;
201 struct cg_proto *cg_proto;
203 cg_proto = tcp_prot.proto_cgroup(memcg);
207 tcp = tcp_from_cgproto(cg_proto);
209 tcp->tcp_prot_mem[idx] = val;