On 08/20, Maciej Fijalkowski wrote: > Eryk reported an issue that I have put under Closes: tag, related to > umem addrs being prematurely produced onto pool's completion queue. > Let us make the skb's destructor responsible for producing all addrs > that given skb used. > > Introduce struct xsk_addrs which will carry descriptor count with array > of addresses taken from processed descriptors that will be carried via > skb_shared_info::destructor_arg. This way we can refer to it within > xsk_destruct_skb(). In order to mitigate the overhead that will be > coming from memory allocations, let us introduce kmem_cache of > xsk_addrs. There will be a single kmem_cache for xsk generic xmit on the > system. > > Commit from fixes tag introduced the buggy behavior, it was not broken > from day 1, but rather when xsk multi-buffer got introduced. > > Fixes: b7f72a30e9ac ("xsk: introduce wrappers and helpers for supporting multi-buffer in Tx path") > Reported-by: Eryk Kubanski <e.kubanski@xxxxxxxxxxxxxxxxxxx> > Closes: https://lore.kernel.org/netdev/20250530103456.53564-1-e.kubanski@xxxxxxxxxxxxxxxxxxx/ > Acked-by: Magnus Karlsson <magnus.karlsson@xxxxxxxxx> > Signed-off-by: Maciej Fijalkowski <maciej.fijalkowski@xxxxxxxxx> > --- > > v1: > https://lore.kernel.org/bpf/20250702101648.1942562-1-maciej.fijalkowski@xxxxxxxxx/ > v2: > https://lore.kernel.org/bpf/20250705135512.1963216-1-maciej.fijalkowski@xxxxxxxxx/ > v3: > https://lore.kernel.org/bpf/20250806154127.2161434-1-maciej.fijalkowski@xxxxxxxxx/ > v4: > https://lore.kernel.org/bpf/20250813171210.2205259-1-maciej.fijalkowski@xxxxxxxxx/ > v5: > https://lore.kernel.org/bpf/aKXBHGPxjpBDKOHq@boxer/T/ > > v1->v2: > * store addrs in array carried via destructor_arg instead having them > stored in skb headroom; cleaner and less hacky approach; > v2->v3: > * use kmem_cache for xsk_addrs allocation (Stan/Olek) > * set err when xsk_addrs allocation fails (Dan) > * change xsk_addrs layout to avoid holes > * free xsk_addrs on error path > * rebase > v3->v4: > * have kmem_cache as percpu vars > * don't drop unnecessary braces (unrelated) (Stan) > * use idx + i in xskq_prod_write_addr (Stan) > * alloc kmem_cache on bind (Stan) > * keep num_descs as first member in xsk_addrs (Magnus) > * add ack from Magnus > v4->v5: > * have a single kmem_cache per xsk subsystem (Stan) > v5->v6: > * free skb in xsk_build_skb_zerocopy() when xsk_addrs allocation fails > (Stan) > * unregister netdev notifier if creating kmem_cache fails (Stan) Acked-by: Stanislav Fomichev <sdf@xxxxxxxxxxx> Thanks!