Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

net: usb: smsc75xx: stop lying about skb->truesize

Some usb drivers try to 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")

Signed-off-by: Eric Dumazet <edumazet@google.com>
Cc: Steve Glendinning <steve.glendinning@shawell.net>
Link: https://lore.kernel.org/r/20240506142358.3657918-1-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Eric Dumazet and committed by
Jakub Kicinski
1b3b2d9e 9aad6e45

+4 -8
+4 -8
drivers/net/usb/smsc75xx.c
··· 2234 2234 rx_cmd_b); 2235 2235 2236 2236 skb_trim(skb, skb->len - 4); /* remove fcs */ 2237 - skb->truesize = size + sizeof(struct sk_buff); 2238 2237 2239 2238 return 1; 2240 2239 } 2241 2240 2242 - ax_skb = skb_clone(skb, GFP_ATOMIC); 2241 + /* Use "size - 4" to remove fcs */ 2242 + ax_skb = netdev_alloc_skb_ip_align(dev->net, size - 4); 2243 2243 if (unlikely(!ax_skb)) { 2244 2244 netdev_warn(dev->net, "Error allocating skb\n"); 2245 2245 return 0; 2246 2246 } 2247 2247 2248 - ax_skb->len = size; 2249 - ax_skb->data = packet; 2250 - skb_set_tail_pointer(ax_skb, size); 2248 + skb_put(ax_skb, size - 4); 2249 + memcpy(ax_skb->data, packet, size - 4); 2251 2250 2252 2251 smsc75xx_rx_csum_offload(dev, ax_skb, rx_cmd_a, 2253 2252 rx_cmd_b); 2254 - 2255 - skb_trim(ax_skb, ax_skb->len - 4); /* remove fcs */ 2256 - ax_skb->truesize = size + sizeof(struct sk_buff); 2257 2253 2258 2254 usbnet_skb_return(dev, ax_skb); 2259 2255 }