net: usb: sr9700: stop lying about skb->truesize
authorEric Dumazet <edumazet@google.com>
Mon, 6 May 2024 14:39:39 +0000 (14:39 +0000)
committerJakub Kicinski <kuba@kernel.org>
Wed, 8 May 2024 00:43:18 +0000 (17:43 -0700)
Some usb drivers set small skb->truesize and break
core networking stacks.

In this patch, I removed one of the skb->truesize override.

I also replaced one skb_clone() by an allocation of a fresh
and small skb, to get minimally sized skbs, like we did
in commit 1e2c61172342 ("net: cdc_ncm: reduce skb truesize
in rx path") and 4ce62d5b2f7a ("net: usb: ax88179_178a:
stop lying about skb->truesize")

Fixes: c9b37458e956 ("USB2NET : SR9700 : One chip USB 1.1 USB2NET SR9700Device Driver Support")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Link: https://lore.kernel.org/r/20240506143939.3673865-1-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/usb/sr9700.c

index 3164451e1010cc80a67e2fddc89a9e59a6721cab..0a662e42ed96593cf20d4209af2bc64a74f307df 100644 (file)
@@ -421,19 +421,15 @@ static int sr9700_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
                        skb_pull(skb, 3);
                        skb->len = len;
                        skb_set_tail_pointer(skb, len);
-                       skb->truesize = len + sizeof(struct sk_buff);
                        return 2;
                }
 
-               /* skb_clone is used for address align */
-               sr_skb = skb_clone(skb, GFP_ATOMIC);
+               sr_skb = netdev_alloc_skb_ip_align(dev->net, len);
                if (!sr_skb)
                        return 0;
 
-               sr_skb->len = len;
-               sr_skb->data = skb->data + 3;
-               skb_set_tail_pointer(sr_skb, len);
-               sr_skb->truesize = len + sizeof(struct sk_buff);
+               skb_put(sr_skb, len);
+               memcpy(sr_skb->data, skb->data + 3, len);
                usbnet_skb_return(dev, sr_skb);
 
                skb_pull(skb, len + SR_RX_OVERHEAD);