[PATCH net-next 0/2] net: devmem: remove gen_pool from dma-buf allocations
From: Stanislav Fomichev <hidden>
Date: 2026-08-31 18:35:32
Also in:
lkml
Replace devmem's gen_pool based fixed-size allocator with a binding-level freelist similar to the one used by io_uring zero-copy receive. This is motivated by allocation latency observed in the NAPI receive path: [ 1036.228913] ? gen_pool_create+0x90/0x90 [ 1036.228915] net_devmem_alloc_dmabuf+0x1f/0x60 [ 1036.228918] mp_dmabuf_devmem_alloc_netmems+0x17/0x80 [ 1036.228920] mlx5e_post_rx_mpwqes+0xdbe/0xdd0 [ 1036.228926] mlx5e_napi_poll+0x113/0x830 [ 1036.228928] ? sched_clock+0x5/0x10 [ 1036.228931] ? wake_up_process+0x778/0x14b0 [ 1036.228933] net_rx_action+0x15d/0x570 [ 1036.228934] ? update_rq_clock+0x31/0x240 [ 1036.228937] ? __napi_schedule+0x55/0xa0 [ 1036.228938] ? mlx5_eq_comp_int+0x137/0x230 [ 1036.228940] ? atomic_notifier_call_chain+0x36/0x90 [ 1036.228943] ? sched_clock+0x5/0x10 [ 1036.228944] ? sched_clock_cpu+0xc/0x170 [ 1036.228947] irq_exit_rcu+0x12b/0x370 [ 1036.228950] common_interrupt+0x85/0x90 udmabuf can create a very large number of SG entries. In the worst case, devmem ends up adding one gen_pool chunk for each net_iov allocation unit backed by those entries. The gen_pool allocation path then has to traverse a linked list that can become too long for this hot path. Patch 1 removes the gen_pool and replaces it with a simple freelist of net_iov pointers protected by the same spin_lock_bh() pattern used by io_uring zcrx. Patch 2 removes the now-unnecessary chunk owner wrapper by embedding the net_iov_area directly in the dma-buf binding. Stanislav Fomichev (2): net: devmem: replace gen_pool with freelist net: devmem: embed net_iov_area in binding net/Kconfig | 1 - net/core/devmem.c | 158 ++++++++++++++++++---------------------------- net/core/devmem.h | 38 ++++------- 3 files changed, 72 insertions(+), 125 deletions(-) -- 2.53.0-Meta