From: Willem de Bruijn <will...@google.com> Paged allocation stores most payload in skb frags. This helps udp gso by avoiding copying from the gso skb to segment skb in skb_segment.
But without scatter-gather, data must be linear, so do not use paged mode unless NETIF_F_SG. Fixes: 15e36f5b8e98 ("udp: paged allocation with gso") Reported-by: Sean Tranchetti <stran...@codeaurora.org> Signed-off-by: Willem de Bruijn <will...@google.com> --- net/ipv4/ip_output.c | 2 +- net/ipv6/ip6_output.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index b5e21eb198d8..b38731d8a44f 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c @@ -884,7 +884,7 @@ static int __ip_append_data(struct sock *sk, exthdrlen = !skb ? rt->dst.header_len : 0; mtu = cork->gso_size ? IP_MAX_MTU : cork->fragsize; - paged = !!cork->gso_size; + paged = cork->gso_size && (rt->dst.dev->features & NETIF_F_SG); if (cork->tx_flags & SKBTX_ANY_SW_TSTAMP && sk->sk_tsflags & SOF_TIMESTAMPING_OPT_ID) diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 7f4493080df6..35a940b9f208 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c @@ -1262,7 +1262,7 @@ static int __ip6_append_data(struct sock *sk, dst_exthdrlen = rt->dst.header_len - rt->rt6i_nfheader_len; } - paged = !!cork->gso_size; + paged = cork->gso_size && (rt->dst.dev->features & NETIF_F_SG); mtu = cork->gso_size ? IP6_MAX_MTU : cork->fragsize; orig_mtu = mtu; -- 2.17.0.441.gb46fe60e1d-goog