mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 04:34:03 +02:00
xsk: account ring allocations to memcg
AF_XDP rings are allocated from setsockopt() and can be mapped into user space. The shared xskq_create() helper allocates the ring backing memory, but the user-controlled and long-lived allocation is not charged as kmem to the allocating memory cgroup. The current implementation uses vmalloc_user(), which allocates the backing pages with GFP_KERNEL | __GFP_ZERO. Use the same VM_USERMAP vmalloc path, but pass GFP_KERNEL_ACCOUNT so the ring backing pages are attributed to memcg/kmem and can be constrained by existing cgroup memory limits. This keeps the existing zeroing and mmap semantics while avoiding AF_XDP-specific optmem or RLIMIT_MEMLOCK accounting. Signed-off-by: Zihan Xi <zihanx@nebusec.ai> Acked-by: Stanislav Fomichev <sdf@fomichev.me> Link: https://patch.msgid.link/20260731164623.4694-2-zihanx@nebusec.ai Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
d21a374995
commit
b0057c68df
|
|
@ -9,6 +9,8 @@
|
|||
#include <linux/vmalloc.h>
|
||||
#include <net/xdp_sock_drv.h>
|
||||
|
||||
#include <asm/shmparam.h>
|
||||
|
||||
#include "xsk_queue.h"
|
||||
|
||||
static size_t xskq_get_ring_size(struct xsk_queue *q, bool umem_queue)
|
||||
|
|
@ -21,6 +23,14 @@ static size_t xskq_get_ring_size(struct xsk_queue *q, bool umem_queue)
|
|||
return struct_size(rxtx_ring, desc, q->nentries);
|
||||
}
|
||||
|
||||
static void *xskq_vmalloc_user(unsigned long size)
|
||||
{
|
||||
return __vmalloc_node_range(size, SHMLBA, VMALLOC_START, VMALLOC_END,
|
||||
GFP_KERNEL_ACCOUNT | __GFP_ZERO, PAGE_KERNEL,
|
||||
VM_USERMAP, NUMA_NO_NODE,
|
||||
__builtin_return_address(0));
|
||||
}
|
||||
|
||||
struct xsk_queue *xskq_create(u32 nentries, bool umem_queue)
|
||||
{
|
||||
struct xsk_queue *q;
|
||||
|
|
@ -46,7 +56,7 @@ struct xsk_queue *xskq_create(u32 nentries, bool umem_queue)
|
|||
|
||||
size = PAGE_ALIGN(size);
|
||||
|
||||
q->ring = vmalloc_user(size);
|
||||
q->ring = xskq_vmalloc_user(size);
|
||||
if (!q->ring) {
|
||||
kfree(q);
|
||||
return NULL;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user