All of lore.kernel.org
 help / color / mirror / Atom feed
From: alex@badcode.im
To: "Jason A. Donenfeld" <Jason@zx2c4.com>
Cc: wireguard@lists.zx2c4.com, netdev@vger.kernel.org,
	Andrew Lunn <andrew+netdev@lunn.ch>,
	"David S . Miller" <davem@davemloft.net>,
	Eric Dumazet <edumazet@kernel.org>,
	Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
	linux-kernel@vger.kernel.org, stable@vger.kernel.org
Subject: Re: [PATCH net 1/2] wireguard: account peer and allowedips allocations to memcg
Date: Tue, 10 Nov 2026 18:04:51 +0000	[thread overview]
Message-ID: <a979d36bb97608275f9f8884764afd41@badcode.im> (raw)
In-Reply-To: <avNM9dfdW1uULJUf@zx2c4.com>

Yes, it is the documented expectation for long-lived objects whose
allocation userspace can trigger. 
Documentation/core-api/memory-allocation.rst
says:

     Untrusted allocations triggered from userspace should be a subject
     of kmem accounting and must have __GFP_ACCOUNT bit set.

Most hardware drivers don't need it because their allocations are sized
by the hardware, not by userspace. Virtual devices configured over
netlink from inside a user namespace are a different case, and the core
stack has been converted for that reason. For example:

     6126891c6d4f ("memcg: enable accounting for IP address and 
routing-related objects")
     c948f51c1654 ("memcg: enable accounting for net_device and Tx/Rx 
queues")
     a89893dd7b08 ("memcg: enable accounting for VLAN group array")
     961c6136359e ("net: enable memcg accounting for veth queues")
     33758c891479 ("memcg: enable accounting for nft objects")

and more recently:

     1beb81947eb4 ("net/sched: account classifier filter allocations to 
memcg")
     b0057c68df71 ("xsk: account ring allocations to memcg")

The fib_trie, ip6_fib and ip6 dst caches are created with SLAB_ACCOUNT,
and the netdev queues and VLAN array use GFP_KERNEL_ACCOUNT. The first
commit describes the same situation as here: a netadmin inside a
container adds many addresses/routes and makes the kernel allocate
unaccounted long-lived memory. WireGuard peers and allowed IPs are the
same kind of object, so they should be charged to the same memcg.

There is no functional change unless a memcg limit is set. Then the
configuring process gets -ENOMEM (or the memcg OOM killer runs) instead
of the allocations silently going past the limit.

Thanks,
Alexander

-------- Исходное сообщение --------
Тема: Re: [PATCH net 1/2] wireguard: account peer and allowedips 
allocations to memcg
Дата: 10.11.2026 16:57
От: "Jason A. Donenfeld" <Jason@zx2c4.com>
Кому: Alexander Ildiyarov <alex@badcode.im>

On Thu, Nov 05, 2026 at 05:10:05PM +0300, Alexander Ildiyarov wrote:
> Peers, allowed IP trie nodes, the per-peer dst_cache and the per-device
> hashtables are all allocated in the context of the process that
> configures the device over netlink, but none of these allocations are
> charged to that process's memory cgroup: the wg_peer and 
> allowedips_node
> caches are created without SLAB_ACCOUNT, and the hashtables and
> dst_cache use plain GFP_KERNEL.
> 
> The amount of memory is bounded only by MAX_PEERS_PER_DEVICE (2^20) per
> device, with no limit on the number of devices or on the number of
> allowed IPs per peer. Since WG_CMD_SET_DEVICE uses GENL_UNS_ADMIN_PERM,
> any user who can create a user and network namespace can do this, and
> thereby escape the memory limits of the cgroup it runs in.
> 
> For example, a process in a cgroup with memory.max=64M that adds 100000
> peers with 20 /128 allowed IPs each grows Slab by ~790 MiB, yet the
> cgroup's memory.current stays below 1 MiB and its memory limit is never
> hit.
> 
> Fix this by creating the two caches with SLAB_ACCOUNT and using
> GFP_KERNEL_ACCOUNT for the hashtables and the dst_cache. The keypair
> allocations are left alone, as they happen from the handshake worker 
> and
> are bounded to three per peer.

I wasn't aware of this trick, I think mostly because most drivers don't
use this. Does any other part of the networking stack do this? Is this a
normal thing?

  reply	other threads:[~2026-11-10 18:05 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-05 14:10 [PATCH net 0/2] wireguard: memcg accounting and initiation race fix Alexander Ildiyarov
2026-11-05 14:10 ` [PATCH net 1/2] wireguard: account peer and allowedips allocations to memcg Alexander Ildiyarov
2026-11-09 15:20   ` netdev-bot+sashiko
2026-11-10 16:57   ` Jason A. Donenfeld
2026-11-10 18:04     ` alex [this message]
2026-11-10 18:06       ` Jason A. Donenfeld
2026-11-05 14:10 ` [PATCH net 2/2] wireguard: noise: recheck replay and flood under write lock on initiation Alexander Ildiyarov
2026-11-09 15:20   ` netdev-bot+sashiko
2026-11-05 14:14 ` [PATCH net 0/2] wireguard: memcg accounting and initiation race fix netdev-bot+sinfo
     [not found] <20261105140815.92841-1-alex@badcode.im>
2026-11-05 14:08 ` [PATCH net 1/2] wireguard: account peer and allowedips allocations to memcg Alexander Ildiyarov
2026-11-10 16:52   ` Jason A. Donenfeld

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=a979d36bb97608275f9f8884764afd41@badcode.im \
    --to=alex@badcode.im \
    --cc=Jason@zx2c4.com \
    --cc=andrew+netdev@lunn.ch \
    --cc=davem@davemloft.net \
    --cc=edumazet@kernel.org \
    --cc=kuba@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=stable@vger.kernel.org \
    --cc=wireguard@lists.zx2c4.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 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.