From: Eric Dumazet Date: Tue, 16 Sep 2025 16:09:47 +0000 (+0000) Subject: udp: update sk_rmem_alloc before busylock acquisition X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=faf7b4aefd5be1d1b460e2161b8f730e03abb9b9;p=users%2Fhch%2Fmisc.git udp: update sk_rmem_alloc before busylock acquisition Avoid piling too many producers on the busylock by updating sk_rmem_alloc before busylock acquisition. Signed-off-by: Eric Dumazet Reviewed-by: David Ahern Reviewed-by: Kuniyuki Iwashima Reviewed-by: Willem de Bruijn Link: https://patch.msgid.link/20250916160951.541279-7-edumazet@google.com Reviewed-by: Jakub Kicinski Signed-off-by: Paolo Abeni --- diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index edd846fee90f..658ae8782799 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c @@ -1753,13 +1753,16 @@ int __udp_enqueue_schedule_skb(struct sock *sk, struct sk_buff *skb) if (rmem > (rcvbuf >> 1)) { skb_condense(skb); size = skb->truesize; + rmem = atomic_add_return(size, &sk->sk_rmem_alloc); + if (rmem > rcvbuf) + goto uncharge_drop; busy = busylock_acquire(sk); + } else { + atomic_add(size, &sk->sk_rmem_alloc); } udp_set_dev_scratch(skb); - atomic_add(size, &sk->sk_rmem_alloc); - spin_lock(&list->lock); err = udp_rmem_schedule(sk, size); if (err) {