We hook udp_send_skb() and udp_v6_send_skb() using BPF fentry programs to monitor UDP transmits. Both functions are static and have two callers: udp{,v6}_sendmsg() and udp{,_v6}_push_pending_frames(). After an FDO profile update, udp_v6_send_skb() is now inlined into udpv6_sendmsg(), while an out-of-line copy remains for udp_v6_push_pending_frames(). The fentry program still attaches successfully, but it is silently bypassed for all uncorked sends. To address this, make both functions noinline explicitly for tracing, as was done for tcp_drop_reason() in commit dbd5e2e79ed8 ("net: tcp: Add noinline_for_tracing annotation for tcp_drop_reason()"). Assisted-by: LLM Signed-off-by: Josh Don --- net/ipv4/udp.c | 4 ++-- net/ipv6/udp.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index b090bd1f59e86..487c8cc8ab206 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c @@ -1110,8 +1110,8 @@ void udp_set_csum(bool nocheck, struct sk_buff *skb, } EXPORT_SYMBOL(udp_set_csum); -static int udp_send_skb(struct sk_buff *skb, struct flowi4 *fl4, - struct inet_cork *cork) +noinline_for_tracing static int +udp_send_skb(struct sk_buff *skb, struct flowi4 *fl4, struct inet_cork *cork) { struct sock *sk = skb->sk; int offset, len, datalen; diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 93478d1ad5769..fe92538835176 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c @@ -1366,8 +1366,8 @@ static void udp6_hwcsum_outgoing(struct sock *sk, struct sk_buff *skb, * Sending */ -static int udp_v6_send_skb(struct sk_buff *skb, struct flowi6 *fl6, - struct inet_cork *cork) +noinline_for_tracing static int +udp_v6_send_skb(struct sk_buff *skb, struct flowi6 *fl6, struct inet_cork *cork) { struct sock *sk = skb->sk; int offset, len, datalen; -- 2.56.0.212.g129ede20d9-goog