aboutsummaryrefslogtreecommitdiffstats
path: root/mm/memcontrol.c
diff options
context:
space:
mode:
authorJohannes Weiner <hannes@cmpxchg.org>2016-01-14 18:21:17 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2016-01-14 19:00:49 -0500
commitbaac50bbc3cdfd184ebf586b1704edbfcee866df (patch)
treeb1b168157c38ef0533d2c8765bb3016d6a495cac /mm/memcontrol.c
parente805605c721021879a1469bdae45c6f80bc985f4 (diff)
net: tcp_memcontrol: simplify linkage between socket and page counter
There won't be any separate counters for socket memory consumed by protocols other than TCP in the future. Remove the indirection and link sockets directly to their owning memory cgroup. Signed-off-by: Johannes Weiner <hannes@cmpxchg.org> Reviewed-by: Vladimir Davydov <vdavydov@virtuozzo.com> Acked-by: David S. Miller <davem@davemloft.net> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/memcontrol.c')
-rw-r--r--mm/memcontrol.c57
1 files changed, 22 insertions, 35 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index f5de783860b8..eaaa86126277 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -294,9 +294,6 @@ static inline struct mem_cgroup *mem_cgroup_from_id(unsigned short id)
294void sock_update_memcg(struct sock *sk) 294void sock_update_memcg(struct sock *sk)
295{ 295{
296 struct mem_cgroup *memcg; 296 struct mem_cgroup *memcg;
297 struct cg_proto *cg_proto;
298
299 BUG_ON(!sk->sk_prot->proto_cgroup);
300 297
301 /* Socket cloning can throw us here with sk_cgrp already 298 /* Socket cloning can throw us here with sk_cgrp already
302 * filled. It won't however, necessarily happen from 299 * filled. It won't however, necessarily happen from
@@ -306,68 +303,58 @@ void sock_update_memcg(struct sock *sk)
306 * Respecting the original socket's memcg is a better 303 * Respecting the original socket's memcg is a better
307 * decision in this case. 304 * decision in this case.
308 */ 305 */
309 if (sk->sk_cgrp) { 306 if (sk->sk_memcg) {
310 BUG_ON(mem_cgroup_is_root(sk->sk_cgrp->memcg)); 307 BUG_ON(mem_cgroup_is_root(sk->sk_memcg));
311 css_get(&sk->sk_cgrp->memcg->css); 308 css_get(&sk->sk_memcg->css);
312 return; 309 return;
313 } 310 }
314 311
315 rcu_read_lock(); 312 rcu_read_lock();
316 memcg = mem_cgroup_from_task(current); 313 memcg = mem_cgroup_from_task(current);
317 cg_proto = sk->sk_prot->proto_cgroup(memcg); 314 if (memcg != root_mem_cgroup &&
318 if (cg_proto && cg_proto->active && 315 memcg->tcp_mem.active &&
319 css_tryget_online(&memcg->css)) { 316 css_tryget_online(&memcg->css))
320 sk->sk_cgrp = cg_proto; 317 sk->sk_memcg = memcg;
321 }
322 rcu_read_unlock(); 318 rcu_read_unlock();
323} 319}
324EXPORT_SYMBOL(sock_update_memcg); 320EXPORT_SYMBOL(sock_update_memcg);
325 321
326void sock_release_memcg(struct sock *sk) 322void sock_release_memcg(struct sock *sk)
327{ 323{
328 WARN_ON(!sk->sk_cgrp->memcg); 324 WARN_ON(!sk->sk_memcg);
329 css_put(&sk->sk_cgrp->memcg->css); 325 css_put(&sk->sk_memcg->css);
330}
331
332struct cg_proto *tcp_proto_cgroup(struct mem_cgroup *memcg)
333{
334 if (!memcg || mem_cgroup_is_root(memcg))
335 return NULL;
336
337 return &memcg->tcp_mem;
338} 326}
339EXPORT_SYMBOL(tcp_proto_cgroup);
340 327
341/** 328/**
342 * mem_cgroup_charge_skmem - charge socket memory 329 * mem_cgroup_charge_skmem - charge socket memory
343 * @proto: proto to charge 330 * @memcg: memcg to charge
344 * @nr_pages: number of pages to charge 331 * @nr_pages: number of pages to charge
345 * 332 *
346 * Charges @nr_pages to @proto. Returns %true if the charge fit within 333 * Charges @nr_pages to @memcg. Returns %true if the charge fit within
347 * @proto's configured limit, %false if the charge had to be forced. 334 * @memcg's configured limit, %false if the charge had to be forced.
348 */ 335 */
349bool mem_cgroup_charge_skmem(struct cg_proto *proto, unsigned int nr_pages) 336bool mem_cgroup_charge_skmem(struct mem_cgroup *memcg, unsigned int nr_pages)
350{ 337{
351 struct page_counter *counter; 338 struct page_counter *counter;
352 339
353 if (page_counter_try_charge(&proto->memory_allocated, 340 if (page_counter_try_charge(&memcg->tcp_mem.memory_allocated,
354 nr_pages, &counter)) { 341 nr_pages, &counter)) {
355 proto->memory_pressure = 0; 342 memcg->tcp_mem.memory_pressure = 0;
356 return true; 343 return true;
357 } 344 }
358 page_counter_charge(&proto->memory_allocated, nr_pages); 345 page_counter_charge(&memcg->tcp_mem.memory_allocated, nr_pages);
359 proto->memory_pressure = 1; 346 memcg->tcp_mem.memory_pressure = 1;
360 return false; 347 return false;
361} 348}
362 349
363/** 350/**
364 * mem_cgroup_uncharge_skmem - uncharge socket memory 351 * mem_cgroup_uncharge_skmem - uncharge socket memory
365 * @proto - proto to uncharge 352 * @memcg - memcg to uncharge
366 * @nr_pages - number of pages to uncharge 353 * @nr_pages - number of pages to uncharge
367 */ 354 */
368void mem_cgroup_uncharge_skmem(struct cg_proto *proto, unsigned int nr_pages) 355void mem_cgroup_uncharge_skmem(struct mem_cgroup *memcg, unsigned int nr_pages)
369{ 356{
370 page_counter_uncharge(&proto->memory_allocated, nr_pages); 357 page_counter_uncharge(&memcg->tcp_mem.memory_allocated, nr_pages);
371} 358}
372 359
373#endif 360#endif
@@ -3653,7 +3640,7 @@ static int memcg_init_kmem(struct mem_cgroup *memcg, struct cgroup_subsys *ss)
3653 if (ret) 3640 if (ret)
3654 return ret; 3641 return ret;
3655 3642
3656 return mem_cgroup_sockets_init(memcg, ss); 3643 return tcp_init_cgroup(memcg, ss);
3657} 3644}
3658 3645
3659static void memcg_deactivate_kmem(struct mem_cgroup *memcg) 3646static void memcg_deactivate_kmem(struct mem_cgroup *memcg)
@@ -3709,7 +3696,7 @@ static void memcg_destroy_kmem(struct mem_cgroup *memcg)
3709 static_key_slow_dec(&memcg_kmem_enabled_key); 3696 static_key_slow_dec(&memcg_kmem_enabled_key);
3710 WARN_ON(page_counter_read(&memcg->kmem)); 3697 WARN_ON(page_counter_read(&memcg->kmem));
3711 } 3698 }
3712 mem_cgroup_sockets_destroy(memcg); 3699 tcp_destroy_cgroup(memcg);
3713} 3700}
3714#else 3701#else
3715static int memcg_init_kmem(struct mem_cgroup *memcg, struct cgroup_subsys *ss) 3702static int memcg_init_kmem(struct mem_cgroup *memcg, struct cgroup_subsys *ss)