From: Jakub Kicinski <kuba@kernel.org>
To: zhaoyz24@mails.tsinghua.edu.cn
Cc: Jakub Kicinski <kuba@kernel.org>,
dsahern@kernel.org, idosch@nvidia.com, davem@davemloft.net,
edumazet@google.com, pabeni@redhat.com, horms@kernel.org,
netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
yangyx22@mails.tsinghua.edu.cn, wangao@seu.edu.cn,
fengxw06@126.com, qli01@tsinghua.edu.cn, xuke@tsinghua.edu.cn,
stable@vger.kernel.org
Subject: Re: [PATCH net] nexthop: account nexthop allocations to memcg
Date: Wed, 29 Jul 2026 17:38:45 -0700 [thread overview]
Message-ID: <20260730003845.4166255-1-kuba@kernel.org> (raw)
In-Reply-To: <20260728060112.30367-1-zhaoyz24@mails.tsinghua.edu.cn>
This is an AI-generated review of your patch. The human sending this
email has considered the AI review valid, or at least plausible.
---
--- Patch [1]: [PATCH net] nexthop: account nexthop allocations to memcg ---
commit 186a5b6499e65039b5037906ec518baac2833b1d
Author: Yizhou Zhao <zhaoyz24@mails.tsinghua.edu.cn>
nexthop: account nexthop allocations to memcg
The nexthop creation path allocates struct nexthop, struct nh_info,
group storage, resilient bucket tables, transient notifier tables and
per-group stats without memcg accounting. As a result, a task with
CAP_NET_ADMIN can create nexthops and resilient groups whose kernel
memory is not charged to the task's memory cgroup, so memory.max does
not constrain this part of the workload.
> diff --git a/net/ipv4/nexthop.c b/net/ipv4/nexthop.c
> index 44fe75004cacb..c8685c5835794 100644
> --- a/net/ipv4/nexthop.c
> +++ b/net/ipv4/nexthop.c
[ ... ]
> @@ -2943,7 +2945,7 @@ static struct nexthop *nexthop_create(struct net *net, struct nh_config *cfg,
> if (!nh)
> return ERR_PTR(-ENOMEM);
>
> - nhi = kzalloc_obj(*nhi);
> + nhi = kzalloc_obj(*nhi, GFP_KERNEL_ACCOUNT);
[Severity: High]
This is a pre-existing issue, but does this patch miss some per-CPU
allocations in the nexthop creation path?
When creating IPv4 and IPv6 nexthops, nh_create_ipv6() and fib_nh_init()
explicitly pass GFP_KERNEL without __GFP_ACCOUNT down to the initialization
functions:
net/ipv4/nexthop.c:nh_create_ipv6() {
...
err = fib6_nh_init(net, fib6_nh, &fib6_cfg, GFP_KERNEL, extack);
...
}
This results in unaccounted per-CPU allocations:
net/ipv6/route.c:fib6_nh_init() {
...
fib6_nh->rt6i_pcpu = alloc_percpu_gfp(struct rt6_info *, gfp_flags);
...
}
A similar missing accounting happens for IPv4 in fib_nh_common_init():
net/ipv4/fib_semantics.c:fib_nh_common_init() {
...
nhc->nhc_pcpu_rth_output = alloc_percpu_gfp(struct rtable __rcu *,
gfp_flags);
...
}
Could an unprivileged user with CAP_NET_ADMIN still bypass memcg limits by
exhausting memory through these per-CPU allocations?
[Severity: High]
This is a pre-existing issue, but do we also need to account for Lightweight
Tunnel (LWT) state allocations?
During nexthop creation with encapsulation attributes, fib_nh_common_init()
triggers LWT state allocation:
net/ipv4/fib_semantics.c:fib_nh_common_init() {
...
err = lwtunnel_build_state(net, encap_type, encap,
nhc->nhc_family, cfg, &lwtstate,
extack);
...
}
The allocation unconditionally uses GFP_ATOMIC without __GFP_ACCOUNT:
net/core/lwtunnel.c:lwtunnel_state_alloc() {
...
lws = kzalloc(sizeof(*lws) + encap_len, GFP_ATOMIC);
...
}
Could a task in a container bypass memory.max limits by creating many nexthops
with encapsulation attributes?
> if (!nhi) {
> kfree(nh);
> return ERR_PTR(-ENOMEM);
next prev parent reply other threads:[~2026-07-30 0:38 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-28 6:01 [PATCH net] nexthop: account nexthop allocations to memcg Yizhou Zhao
2026-07-30 0:38 ` Jakub Kicinski [this message]
2026-07-30 0:39 ` Jakub Kicinski
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=20260730003845.4166255-1-kuba@kernel.org \
--to=kuba@kernel.org \
--cc=davem@davemloft.net \
--cc=dsahern@kernel.org \
--cc=edumazet@google.com \
--cc=fengxw06@126.com \
--cc=horms@kernel.org \
--cc=idosch@nvidia.com \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=qli01@tsinghua.edu.cn \
--cc=stable@vger.kernel.org \
--cc=wangao@seu.edu.cn \
--cc=xuke@tsinghua.edu.cn \
--cc=yangyx22@mails.tsinghua.edu.cn \
--cc=zhaoyz24@mails.tsinghua.edu.cn \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.