include/net/sock.h | 5 ++- net/core/devmem.c | 31 +++++++------- net/core/devmem.h | 4 +- net/core/sock.c | 24 +++++++---- net/ipv4/tcp.c | 107 +++++++++++++++-------------------------------- net/ipv4/tcp_ipv4.c | 40 +++++++++++++++--- net/ipv4/tcp_minisocks.c | 2 - 7 files changed, 107 insertions(+), 106 deletions(-)
This series improves the CPU cost of RX token management by replacing the xarray allocator with a normal array of atomics. Similar to devmem TX's page-index lookup scheme for niovs, RX also uses page indices to lookup the corresponding atomic in the array. Improvement is ~5% per RX user thread. Two other approaches were tested, but with no improvement. Namely, 1) using a hashmap for tokens and 2) keeping an xarray of atomic counters but using RCU so that the hotpath could be mostly lockless. Neither of these approaches proved better than the simple array in terms of CPU. Signed-off-by: Bobby Eshleman <bobbyeshleman@meta.com> --- Bobby Eshleman (2): net: devmem: rename tx_vec to vec in dmabuf binding net: devmem: use niov array for token management include/net/sock.h | 5 ++- net/core/devmem.c | 31 +++++++------- net/core/devmem.h | 4 +- net/core/sock.c | 24 +++++++---- net/ipv4/tcp.c | 107 +++++++++++++++-------------------------------- net/ipv4/tcp_ipv4.c | 40 +++++++++++++++--- net/ipv4/tcp_minisocks.c | 2 - 7 files changed, 107 insertions(+), 106 deletions(-) --- base-commit: cd8a4cfa6bb43a441901e82f5c222dddc75a18a3 change-id: 20250829-scratch-bobbyeshleman-devmem-tcp-token-upstream-292be174d503 Best regards, -- Bobby Eshleman <bobbyeshleman@meta.com>
syzbot ci has tested the following series [v1] net: devmem: improve cpu cost of RX token management https://lore.kernel.org/all/20250902-scratch-bobbyeshleman-devmem-tcp-token-upstream-v1-0-d946169b5550@meta.com * [PATCH net-next 1/2] net: devmem: rename tx_vec to vec in dmabuf binding * [PATCH net-next 2/2] net: devmem: use niov array for token management and found the following issue: general protection fault in sock_devmem_dontneed Full report is available here: https://ci.syzbot.org/series/c0dc7223-4222-461c-b04b-b6f0004c7509 *** general protection fault in sock_devmem_dontneed tree: net-next URL: https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net-next.git base: 864ecc4a6dade82d3f70eab43dad0e277aa6fc78 arch: amd64 compiler: Debian clang version 20.1.8 (++20250708063551+0c9f909b7976-1~exp1~20250708183702.136), Debian LLD 20.1.8 config: https://ci.syzbot.org/builds/6c521908-0a73-48bc-a0fd-2576cf868361/config C repro: https://ci.syzbot.org/findings/9374f388-d643-42ea-831b-872eb5000b3c/c_repro syz repro: https://ci.syzbot.org/findings/9374f388-d643-42ea-831b-872eb5000b3c/syz_repro Oops: general protection fault, probably for non-canonical address 0xdffffc0000000000: 0000 [#1] SMP KASAN PTI KASAN: null-ptr-deref in range [0x0000000000000000-0x0000000000000007] CPU: 0 UID: 0 PID: 5993 Comm: syz.0.17 Not tainted syzkaller #0 PREEMPT(full) Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.2-debian-1.16.2-1 04/01/2014 RIP: 0010:sock_devmem_dontneed+0x3fd/0x960 net/core/sock.c:1112 Code: 8b 44 24 40 44 8b 28 44 03 6c 24 14 48 8b 44 24 20 42 80 3c 20 00 74 08 4c 89 ff e8 4d eb c9 f8 4d 8b 3f 4c 89 f8 48 c1 e8 03 <42> 80 3c 20 00 74 08 4c 89 ff e8 34 eb c9 f8 4d 8b 3f 4c 89 f8 48 RSP: 0018:ffffc90001c4fac0 EFLAGS: 00010246 RAX: 0000000000000000 RBX: 0000000000000000 RCX: 1ffff11004ddcfe0 RDX: ffff88801f6a8000 RSI: 0000000000000400 RDI: 0000000000000000 RBP: ffffc90001c4fc50 R08: ffffc90001c4fbdf R09: 0000000000000000 R10: ffffc90001c4fb60 R11: fffff52000389f7c R12: dffffc0000000000 R13: 00000000ffffffff R14: 0000000000000000 R15: 0000000000000000 FS: 000055558634d500(0000) GS:ffff8880b8614000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000001b30e63fff CR3: 0000000026b68000 CR4: 00000000000006f0 Call Trace: <TASK> sk_setsockopt+0x682/0x2dc0 net/core/sock.c:1302 do_sock_setsockopt+0x11b/0x1b0 net/socket.c:2340 __sys_setsockopt net/socket.c:2369 [inline] __do_sys_setsockopt net/socket.c:2375 [inline] __se_sys_setsockopt net/socket.c:2372 [inline] __x64_sys_setsockopt+0x13f/0x1b0 net/socket.c:2372 do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline] do_syscall_64+0xfa/0x3b0 arch/x86/entry/syscall_64.c:94 entry_SYSCALL_64_after_hwframe+0x77/0x7f RIP: 0033:0x7fea2bb8ebe9 Code: ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 40 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 a8 ff ff ff f7 d8 64 89 01 48 RSP: 002b:00007ffc81c63348 EFLAGS: 00000246 ORIG_RAX: 0000000000000036 RAX: ffffffffffffffda RBX: 00007fea2bdc5fa0 RCX: 00007fea2bb8ebe9 RDX: 0000000000000050 RSI: 0000000000000001 RDI: 0000000000000003 RBP: 00007fea2bc11e19 R08: 0000000000000048 R09: 0000000000000000 R10: 0000200000000100 R11: 0000000000000246 R12: 0000000000000000 R13: 00007fea2bdc5fa0 R14: 00007fea2bdc5fa0 R15: 0000000000000005 </TASK> Modules linked in: ---[ end trace 0000000000000000 ]--- RIP: 0010:sock_devmem_dontneed+0x3fd/0x960 net/core/sock.c:1112 Code: 8b 44 24 40 44 8b 28 44 03 6c 24 14 48 8b 44 24 20 42 80 3c 20 00 74 08 4c 89 ff e8 4d eb c9 f8 4d 8b 3f 4c 89 f8 48 c1 e8 03 <42> 80 3c 20 00 74 08 4c 89 ff e8 34 eb c9 f8 4d 8b 3f 4c 89 f8 48 RSP: 0018:ffffc90001c4fac0 EFLAGS: 00010246 RAX: 0000000000000000 RBX: 0000000000000000 RCX: 1ffff11004ddcfe0 RDX: ffff88801f6a8000 RSI: 0000000000000400 RDI: 0000000000000000 RBP: ffffc90001c4fc50 R08: ffffc90001c4fbdf R09: 0000000000000000 R10: ffffc90001c4fb60 R11: fffff52000389f7c R12: dffffc0000000000 R13: 00000000ffffffff R14: 0000000000000000 R15: 0000000000000000 FS: 000055558634d500(0000) GS:ffff8880b8614000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000001b30e63fff CR3: 0000000026b68000 CR4: 00000000000006f0 ---------------- Code disassembly (best guess): 0: 8b 44 24 40 mov 0x40(%rsp),%eax 4: 44 8b 28 mov (%rax),%r13d 7: 44 03 6c 24 14 add 0x14(%rsp),%r13d c: 48 8b 44 24 20 mov 0x20(%rsp),%rax 11: 42 80 3c 20 00 cmpb $0x0,(%rax,%r12,1) 16: 74 08 je 0x20 18: 4c 89 ff mov %r15,%rdi 1b: e8 4d eb c9 f8 call 0xf8c9eb6d 20: 4d 8b 3f mov (%r15),%r15 23: 4c 89 f8 mov %r15,%rax 26: 48 c1 e8 03 shr $0x3,%rax * 2a: 42 80 3c 20 00 cmpb $0x0,(%rax,%r12,1) <-- trapping instruction 2f: 74 08 je 0x39 31: 4c 89 ff mov %r15,%rdi 34: e8 34 eb c9 f8 call 0xf8c9eb6d 39: 4d 8b 3f mov (%r15),%r15 3c: 4c 89 f8 mov %r15,%rax 3f: 48 rex.W *** If these findings have caused you to resend the series or submit a separate fix, please add the following tag to your commit message: Tested-by: syzbot@syzkaller.appspotmail.com --- This report is generated by a bot. It may contain errors. syzbot ci engineers can be reached at syzkaller@googlegroups.com.
© 2016 - 2025 Red Hat, Inc.