Fix sock_exceed_buf_limit not being triggered in __sk_mem_raise_allocated
authorTengteng Yang <yangtengteng@bytedance.com>
Tue, 27 May 2025 03:04:19 +0000 (11:04 +0800)
committerJakub Kicinski <kuba@kernel.org>
Thu, 29 May 2025 02:07:53 +0000 (19:07 -0700)
When a process under memory pressure is not part of any cgroup and
the charged flag is false, trace_sock_exceed_buf_limit was not called
as expected.

This regression was introduced by commit 2def8ff3fdb6 ("sock:
Code cleanup on __sk_mem_raise_allocated()"). The fix changes the
default value of charged to true while preserving existing logic.

Fixes: 2def8ff3fdb6 ("sock: Code cleanup on __sk_mem_raise_allocated()")
Signed-off-by: Abel Wu <wuyun.abel@bytedance.com>
Signed-off-by: Tengteng Yang <yangtengteng@bytedance.com>
Link: https://patch.msgid.link/20250527030419.67693-1-yangtengteng@bytedance.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/core/sock.c

index 341979874459831406bc310cb81f0b75a3e89929..3b409bc8ef6d81828cef63bc828db932abb1cfab 100644 (file)
@@ -3284,16 +3284,16 @@ int __sk_mem_raise_allocated(struct sock *sk, int size, int amt, int kind)
 {
        struct mem_cgroup *memcg = mem_cgroup_sockets_enabled ? sk->sk_memcg : NULL;
        struct proto *prot = sk->sk_prot;
-       bool charged = false;
+       bool charged = true;
        long allocated;
 
        sk_memory_allocated_add(sk, amt);
        allocated = sk_memory_allocated(sk);
 
        if (memcg) {
-               if (!mem_cgroup_charge_skmem(memcg, amt, gfp_memcg_charge()))
+               charged = mem_cgroup_charge_skmem(memcg, amt, gfp_memcg_charge());
+               if (!charged)
                        goto suppress_allocation;
-               charged = true;
        }
 
        /* Under limit. */
@@ -3378,7 +3378,7 @@ suppress_allocation:
 
        sk_memory_allocated_sub(sk, amt);
 
-       if (charged)
+       if (memcg && charged)
                mem_cgroup_uncharge_skmem(memcg, amt);
 
        return 0;