From: Cai Xinchen <caixinchen1@huawei.com>
To: <tj@kernel.org>, <hannes@cmpxchg.org>, <mkoutny@suse.com>,
<corbet@lwn.net>, <skhan@linuxfoundation.org>,
<rdunlap@infradead.org>, <edumazet@google.com>,
<kuniyu@google.com>, <pabeni@redhat.com>, <willemb@google.com>,
<davem@davemloft.net>, <kuba@kernel.org>, <horms@kernel.org>,
<ncardwell@google.com>, <matttbe@kernel.org>,
<martineau@kernel.org>, <geliang@kernel.org>, <mhocko@kernel.org>,
<roman.gushchin@linux.dev>, <shakeel.butt@linux.dev>,
<muchun.song@linux.dev>
Cc: <cgroups@vger.kernel.org>, <linux-doc@vger.kernel.org>,
<linux-kernel@vger.kernel.org>, <netdev@vger.kernel.org>,
<mptcp@lists.linux.dev>, <linux-mm@kvack.org>,
<linux-kselftest@vger.kernel.org>, <caixinchen1@huawei.com>,
<lujialin4@huawei.com>
Subject: [PATCH RFC -next 0/5] net: charge socket memory budget to memcg upfront
Date: Thu, 24 Sep 2026 16:02:14 +0800 [thread overview]
Message-ID: <20260924080219.1036588-1-caixinchen1@huawei.com> (raw)
The memcg socket accounting currently charges pages to the memory
cgroup per grant (__sk_mem_schedule() publishing forward allocation)
and refunds them later from skb destructors. The refund side folds
per-skb "was this charged" snapshots back into the socket balance
under concurrent lockless RMW, and races there can drive the memcg
socket balance negative, ending with:
page_counter underflow
WARNING: ... mm/page_counter.c ... page_counter_cancel()
This series flips the model: a socket is charged its whole memory
budget (sk_sndbuf + sk_rcvbuf + sk_reserved_mem) to its memcg when the
budget is established or grows, and refunded when the budget shrinks
or the socket dies. Grants and per-skb charge/uncharge stop touching
the memcg entirely, so the racy refund pairing has no code left to go
wrong: refunds can never exceed charges and the balance cannot
underflow by construction.
Beyond removing the racy pairing, charging the budget is the more
accurate accounting: once the budget is established the memory is
effectively allocated to that socket - the protocol fills the buffers
on demand and no other socket in the cgroup can spend that capacity.
The "sock" counter therefore reports memory the sockets already own
rather than memory that happens to be in flight at the sampling
instant, the same model vm_committed_as uses for claimed address
space and hugetlb uses for reservations (charged at creation, not at
first touch). The visible consequence is that an idle socket holds
its full budget charged for its lifetime. Global protocol accounting
(memory_allocated, tcp_mem pressure) is untouched.
Patch overview:
1/5 net: charge socket memory budget to memcg upfront
Core tracker (sk_memcg_budget), lifecycle charge points, memcg
removal from the grant path, lazy shrink sync in sk_mem_reclaim().
2/5 tcp: sync memcg budget on protocol buffer updates
tcp_init_sock(), tcp_set_rcvlowat() and the four autotune/pressure
buffer writes in tcp_input.c.
3/5 mptcp: sync memcg budget and drop backlog page compensation
MPTCP budget writes, memcg inheritance transfer, and removal of
the now double-charging backlog_unaccounted compensation.
4/5 Docs/admin-guide/cgroup-v2: document upfront socket budget
charging
5/5 selftests/cgroup: compare socket memory deltas in test_memcg_sock
Make the test valid under both the old and the new model.
Tested: full arm64 build with 0 warnings; each intermediate state
compiles (bisectable); tools/testing/selftests/cgroup builds clean.
Runtime validation on the workload that used to trigger the underflow
is pending.
Cai Xinchen (5):
net: charge socket memory budget to memcg upfront
tcp: sync memcg budget on protocol buffer updates
mptcp: sync memcg budget and drop backlog page compensation
Docs/admin-guide/cgroup-v2: document upfront socket budget charging
selftests/cgroup: compare socket memory deltas in test_memcg_sock
Documentation/admin-guide/cgroup-v2.rst | 6 +-
include/net/sock.h | 21 ++
net/core/sock.c | 237 ++++++++++++++----
net/ipv4/tcp.c | 11 +-
net/ipv4/tcp_input.c | 10 +-
net/mptcp/protocol.c | 42 +---
net/mptcp/protocol.h | 2 +-
net/mptcp/sockopt.c | 3 +
net/mptcp/subflow.c | 5 +
.../selftests/cgroup/test_memcontrol.c | 18 +-
10 files changed, 261 insertions(+), 94 deletions(-)
--
2.18.0.huawei.25
next reply other threads:[~2026-09-24 7:36 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-24 8:02 Cai Xinchen [this message]
2026-09-24 8:02 ` [PATCH RFC -next 1/5] " Cai Xinchen
2026-09-24 8:02 ` [PATCH RFC -next 2/5] tcp: sync memcg budget on protocol buffer updates Cai Xinchen
2026-09-24 8:02 ` [PATCH RFC -next 3/5] mptcp: sync memcg budget and drop backlog page compensation Cai Xinchen
2026-09-24 8:02 ` [PATCH RFC -next 4/5] Docs/admin-guide/cgroup-v2: document upfront socket budget charging Cai Xinchen
2026-09-24 8:02 ` [PATCH RFC -next 5/5] selftests/cgroup: compare socket memory deltas in test_memcg_sock Cai Xinchen
2026-09-24 8:26 ` [PATCH RFC -next 0/5] net: charge socket memory budget to memcg upfront Eric Dumazet
2026-09-24 9:25 ` Cai Xinchen
2026-09-24 9:28 ` Cai Xinchen
2026-09-24 9:55 ` Eric Dumazet
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260924080219.1036588-1-caixinchen1@huawei.com \
--to=caixinchen1@huawei.com \
--cc=cgroups@vger.kernel.org \
--cc=corbet@lwn.net \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=geliang@kernel.org \
--cc=hannes@cmpxchg.org \
--cc=horms@kernel.org \
--cc=kuba@kernel.org \
--cc=kuniyu@google.com \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=lujialin4@huawei.com \
--cc=martineau@kernel.org \
--cc=matttbe@kernel.org \
--cc=mhocko@kernel.org \
--cc=mkoutny@suse.com \
--cc=mptcp@lists.linux.dev \
--cc=muchun.song@linux.dev \
--cc=ncardwell@google.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=rdunlap@infradead.org \
--cc=roman.gushchin@linux.dev \
--cc=shakeel.butt@linux.dev \
--cc=skhan@linuxfoundation.org \
--cc=tj@kernel.org \
--cc=willemb@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®