]> git.dujemihanovic.xyz Git - linux.git/commitdiff
usb: aqc111: stop lying about skb->truesize
authorEric Dumazet <edumazet@google.com>
Mon, 6 May 2024 13:55:46 +0000 (13:55 +0000)
committerJakub Kicinski <kuba@kernel.org>
Wed, 8 May 2024 00:37:24 +0000 (17:37 -0700)
Some usb drivers try to set small skb->truesize and break
core networking stacks.

I replace 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: 361459cd9642 ("net: usb: aqc111: Implement RX data path")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Link: https://lore.kernel.org/r/20240506135546.3641185-1-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/usb/aqc111.c

index 74571c8e7691983874af10e4fb187e0eed292b47..ff5be2cbf17b90a7914c8620bfd1e7b3766e123d 100644 (file)
@@ -1141,17 +1141,15 @@ static int aqc111_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
                        continue;
                }
 
-               /* Clone SKB */
-               new_skb = skb_clone(skb, GFP_ATOMIC);
+               new_skb = netdev_alloc_skb_ip_align(dev->net, pkt_len);
 
                if (!new_skb)
                        goto err;
 
-               new_skb->len = pkt_len;
+               skb_put(new_skb, pkt_len);
+               memcpy(new_skb->data, skb->data, pkt_len);
                skb_pull(new_skb, AQ_RX_HW_PAD);
-               skb_set_tail_pointer(new_skb, new_skb->len);
 
-               new_skb->truesize = SKB_TRUESIZE(new_skb->len);
                if (aqc111_data->rx_checksum)
                        aqc111_rx_checksum(new_skb, pkt_desc);