• G
    net: introduce res_counter_charge_nofail() for socket allocations · 0e90b31f
    Glauber Costa 提交于
    There is a case in __sk_mem_schedule(), where an allocation
    is beyond the maximum, but yet we are allowed to proceed.
    It happens under the following condition:
    
    	sk->sk_wmem_queued + size >= sk->sk_sndbuf
    
    The network code won't revert the allocation in this case,
    meaning that at some point later it'll try to do it. Since
    this is never communicated to the underlying res_counter
    code, there is an inbalance in res_counter uncharge operation.
    
    I see two ways of fixing this:
    
    1) storing the information about those allocations somewhere
       in memcg, and then deducting from that first, before
       we start draining the res_counter,
    2) providing a slightly different allocation function for
       the res_counter, that matches the original behavior of
       the network code more closely.
    
    I decided to go for #2 here, believing it to be more elegant,
    since #1 would require us to do basically that, but in a more
    obscure way.
    Signed-off-by: NGlauber Costa <glommer@parallels.com>
    Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Michal Hocko <mhocko@suse.cz>
    CC: Tejun Heo <tj@kernel.org>
    CC: Li Zefan <lizf@cn.fujitsu.com>
    CC: Laurent Chavey <chavey@google.com>
    Acked-by: NTejun Heo <tj@kernel.org>
    Signed-off-by: NDavid S. Miller <davem@davemloft.net>
    0e90b31f
sock.c 66.6 KB