2 #include <net/tcp_memcontrol.h>
5 #include <linux/nsproxy.h>
6 #include <linux/memcontrol.h>
7 #include <linux/module.h>
9 static struct cftype tcp_files
[4]; /* XXX: will be removed soon */
11 static inline struct tcp_memcontrol
*tcp_from_cgproto(struct cg_proto
*cg_proto
)
13 return container_of(cg_proto
, struct tcp_memcontrol
, cg_proto
);
16 static void memcg_tcp_enter_memory_pressure(struct sock
*sk
)
18 if (sk
->sk_cgrp
->memory_pressure
)
19 *sk
->sk_cgrp
->memory_pressure
= 1;
21 EXPORT_SYMBOL(memcg_tcp_enter_memory_pressure
);
23 int tcp_init_cgroup(struct cgroup
*cgrp
, struct cgroup_subsys
*ss
)
26 * The root cgroup does not use res_counters, but rather,
27 * rely on the data already collected by the network
30 struct res_counter
*res_parent
= NULL
;
31 struct cg_proto
*cg_proto
, *parent_cg
;
32 struct tcp_memcontrol
*tcp
;
33 struct mem_cgroup
*memcg
= mem_cgroup_from_cont(cgrp
);
34 struct mem_cgroup
*parent
= parent_mem_cgroup(memcg
);
35 struct net
*net
= current
->nsproxy
->net_ns
;
37 cg_proto
= tcp_prot
.proto_cgroup(memcg
);
41 tcp
= tcp_from_cgproto(cg_proto
);
43 tcp
->tcp_prot_mem
[0] = net
->ipv4
.sysctl_tcp_mem
[0];
44 tcp
->tcp_prot_mem
[1] = net
->ipv4
.sysctl_tcp_mem
[1];
45 tcp
->tcp_prot_mem
[2] = net
->ipv4
.sysctl_tcp_mem
[2];
46 tcp
->tcp_memory_pressure
= 0;
48 parent_cg
= tcp_prot
.proto_cgroup(parent
);
50 res_parent
= parent_cg
->memory_allocated
;
52 res_counter_init(&tcp
->tcp_memory_allocated
, res_parent
);
53 percpu_counter_init(&tcp
->tcp_sockets_allocated
, 0);
55 cg_proto
->enter_memory_pressure
= memcg_tcp_enter_memory_pressure
;
56 cg_proto
->memory_pressure
= &tcp
->tcp_memory_pressure
;
57 cg_proto
->sysctl_mem
= tcp
->tcp_prot_mem
;
58 cg_proto
->memory_allocated
= &tcp
->tcp_memory_allocated
;
59 cg_proto
->sockets_allocated
= &tcp
->tcp_sockets_allocated
;
60 cg_proto
->memcg
= memcg
;
63 return cgroup_add_files(cgrp
, ss
, tcp_files
,
64 ARRAY_SIZE(tcp_files
));
66 EXPORT_SYMBOL(tcp_init_cgroup
);
68 void tcp_destroy_cgroup(struct cgroup
*cgrp
)
70 struct mem_cgroup
*memcg
= mem_cgroup_from_cont(cgrp
);
71 struct cg_proto
*cg_proto
;
72 struct tcp_memcontrol
*tcp
;
75 cg_proto
= tcp_prot
.proto_cgroup(memcg
);
79 tcp
= tcp_from_cgproto(cg_proto
);
80 percpu_counter_destroy(&tcp
->tcp_sockets_allocated
);
82 val
= res_counter_read_u64(&tcp
->tcp_memory_allocated
, RES_LIMIT
);
84 if (val
!= RESOURCE_MAX
)
85 static_key_slow_dec(&memcg_socket_limit_enabled
);
87 EXPORT_SYMBOL(tcp_destroy_cgroup
);
89 static int tcp_update_limit(struct mem_cgroup
*memcg
, u64 val
)
91 struct net
*net
= current
->nsproxy
->net_ns
;
92 struct tcp_memcontrol
*tcp
;
93 struct cg_proto
*cg_proto
;
98 cg_proto
= tcp_prot
.proto_cgroup(memcg
);
102 if (val
> RESOURCE_MAX
)
105 tcp
= tcp_from_cgproto(cg_proto
);
107 old_lim
= res_counter_read_u64(&tcp
->tcp_memory_allocated
, RES_LIMIT
);
108 ret
= res_counter_set_limit(&tcp
->tcp_memory_allocated
, val
);
112 for (i
= 0; i
< 3; i
++)
113 tcp
->tcp_prot_mem
[i
] = min_t(long, val
>> PAGE_SHIFT
,
114 net
->ipv4
.sysctl_tcp_mem
[i
]);
116 if (val
== RESOURCE_MAX
&& old_lim
!= RESOURCE_MAX
)
117 static_key_slow_dec(&memcg_socket_limit_enabled
);
118 else if (old_lim
== RESOURCE_MAX
&& val
!= RESOURCE_MAX
)
119 static_key_slow_inc(&memcg_socket_limit_enabled
);
124 static int tcp_cgroup_write(struct cgroup
*cont
, struct cftype
*cft
,
127 struct mem_cgroup
*memcg
= mem_cgroup_from_cont(cont
);
128 unsigned long long val
;
131 switch (cft
->private) {
133 /* see memcontrol.c */
134 ret
= res_counter_memparse_write_strategy(buffer
, &val
);
137 ret
= tcp_update_limit(memcg
, val
);
146 static u64
tcp_read_stat(struct mem_cgroup
*memcg
, int type
, u64 default_val
)
148 struct tcp_memcontrol
*tcp
;
149 struct cg_proto
*cg_proto
;
151 cg_proto
= tcp_prot
.proto_cgroup(memcg
);
155 tcp
= tcp_from_cgproto(cg_proto
);
156 return res_counter_read_u64(&tcp
->tcp_memory_allocated
, type
);
159 static u64
tcp_read_usage(struct mem_cgroup
*memcg
)
161 struct tcp_memcontrol
*tcp
;
162 struct cg_proto
*cg_proto
;
164 cg_proto
= tcp_prot
.proto_cgroup(memcg
);
166 return atomic_long_read(&tcp_memory_allocated
) << PAGE_SHIFT
;
168 tcp
= tcp_from_cgproto(cg_proto
);
169 return res_counter_read_u64(&tcp
->tcp_memory_allocated
, RES_USAGE
);
172 static u64
tcp_cgroup_read(struct cgroup
*cont
, struct cftype
*cft
)
174 struct mem_cgroup
*memcg
= mem_cgroup_from_cont(cont
);
177 switch (cft
->private) {
179 val
= tcp_read_stat(memcg
, RES_LIMIT
, RESOURCE_MAX
);
182 val
= tcp_read_usage(memcg
);
186 val
= tcp_read_stat(memcg
, cft
->private, 0);
194 static int tcp_cgroup_reset(struct cgroup
*cont
, unsigned int event
)
196 struct mem_cgroup
*memcg
;
197 struct tcp_memcontrol
*tcp
;
198 struct cg_proto
*cg_proto
;
200 memcg
= mem_cgroup_from_cont(cont
);
201 cg_proto
= tcp_prot
.proto_cgroup(memcg
);
204 tcp
= tcp_from_cgproto(cg_proto
);
208 res_counter_reset_max(&tcp
->tcp_memory_allocated
);
211 res_counter_reset_failcnt(&tcp
->tcp_memory_allocated
);
218 unsigned long long tcp_max_memory(const struct mem_cgroup
*memcg
)
220 struct tcp_memcontrol
*tcp
;
221 struct cg_proto
*cg_proto
;
223 cg_proto
= tcp_prot
.proto_cgroup((struct mem_cgroup
*)memcg
);
227 tcp
= tcp_from_cgproto(cg_proto
);
228 return res_counter_read_u64(&tcp
->tcp_memory_allocated
, RES_LIMIT
);
231 void tcp_prot_mem(struct mem_cgroup
*memcg
, long val
, int idx
)
233 struct tcp_memcontrol
*tcp
;
234 struct cg_proto
*cg_proto
;
236 cg_proto
= tcp_prot
.proto_cgroup(memcg
);
240 tcp
= tcp_from_cgproto(cg_proto
);
242 tcp
->tcp_prot_mem
[idx
] = val
;
245 static struct cftype tcp_files
[] = {
247 .name
= "kmem.tcp.limit_in_bytes",
248 .write_string
= tcp_cgroup_write
,
249 .read_u64
= tcp_cgroup_read
,
250 .private = RES_LIMIT
,
253 .name
= "kmem.tcp.usage_in_bytes",
254 .read_u64
= tcp_cgroup_read
,
255 .private = RES_USAGE
,
258 .name
= "kmem.tcp.failcnt",
259 .private = RES_FAILCNT
,
260 .trigger
= tcp_cgroup_reset
,
261 .read_u64
= tcp_cgroup_read
,
264 .name
= "kmem.tcp.max_usage_in_bytes",
265 .private = RES_MAX_USAGE
,
266 .trigger
= tcp_cgroup_reset
,
267 .read_u64
= tcp_cgroup_read
,