net: tcp_memcontrol: remove bogus hierarchy pressure propagation
authorJohannes Weiner <hannes@cmpxchg.org>
Thu, 14 Jan 2016 23:21:02 +0000 (15:21 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 15 Jan 2016 00:00:49 +0000 (16:00 -0800)
When a cgroup currently breaches its socket memory limit, it enters
memory pressure mode for itself and its *ancestors*.  This throttles
transmission in unrelated sibling and cousin subtrees that have nothing
to do with the breached limit.

On the contrary, breaching a limit should make that group and its
*children* enter memory pressure mode.  But this happens already, albeit
lazily: if an ancestor limit is breached, siblings will enter memory
pressure on their own once the next packet arrives for them.

So no additional hierarchy code is needed.  Remove the bogus stuff.

Signed-off-by: Johannes Weiner <hannes@cmpxchg.org>
Acked-by: David S. Miller <davem@davemloft.net>
Reviewed-by: Vladimir Davydov <vdavydov@virtuozzo.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
include/net/sock.h

index 9ef3d7c984b442a858bd1b7b43d4cda9ecb586d6..d3b035c7362b9f96811e5e1e0f439f8589fb7f73 100644 (file)
@@ -1155,14 +1155,8 @@ static inline void sk_leave_memory_pressure(struct sock *sk)
        if (*memory_pressure)
                *memory_pressure = 0;
 
-       if (mem_cgroup_sockets_enabled && sk->sk_cgrp) {
-               struct cg_proto *cg_proto = sk->sk_cgrp;
-               struct proto *prot = sk->sk_prot;
-
-               for (; cg_proto; cg_proto = parent_cg_proto(prot, cg_proto))
-                       cg_proto->memory_pressure = 0;
-       }
-
+       if (mem_cgroup_sockets_enabled && sk->sk_cgrp)
+               sk->sk_cgrp->memory_pressure = 0;
 }
 
 static inline void sk_enter_memory_pressure(struct sock *sk)
@@ -1170,13 +1164,8 @@ static inline void sk_enter_memory_pressure(struct sock *sk)
        if (!sk->sk_prot->enter_memory_pressure)
                return;
 
-       if (mem_cgroup_sockets_enabled && sk->sk_cgrp) {
-               struct cg_proto *cg_proto = sk->sk_cgrp;
-               struct proto *prot = sk->sk_prot;
-
-               for (; cg_proto; cg_proto = parent_cg_proto(prot, cg_proto))
-                       cg_proto->memory_pressure = 1;
-       }
+       if (mem_cgroup_sockets_enabled && sk->sk_cgrp)
+               sk->sk_cgrp->memory_pressure = 1;
 
        sk->sk_prot->enter_memory_pressure(sk);
 }