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

usbnet: do not pretend to support SG/TSO

usbnet doesn't support yet SG, so drivers should not advertise SG or TSO
capabilities, as they allow TCP stack to build large TSO packets that
need to be linearized and might use order-5 pages.

This adds an extra copy overhead and possible allocation failures.

Current code ignore skb_linearize() return code so crashes are even
possible.

Best is to not pretend SG/TSO is supported, and add this again when/if
usbnet really supports SG for devices who could get a performance gain.

Based on a prior patch from Freddy Xin <freddy@asix.com.tw>

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Eric Dumazet and committed by
David S. Miller
20f01703 1df86b4c

+7 -14
+4 -5
drivers/net/usb/ax88179_178a.c
··· 1029 1029 dev->mii.supports_gmii = 1; 1030 1030 1031 1031 dev->net->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | 1032 - NETIF_F_RXCSUM | NETIF_F_SG | NETIF_F_TSO; 1032 + NETIF_F_RXCSUM; 1033 1033 1034 1034 dev->net->hw_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | 1035 - NETIF_F_RXCSUM | NETIF_F_SG | NETIF_F_TSO; 1035 + NETIF_F_RXCSUM; 1036 1036 1037 1037 /* Enable checksum offload */ 1038 1038 *tmp = AX_RXCOE_IP | AX_RXCOE_TCP | AX_RXCOE_UDP | ··· 1173 1173 if (((skb->len + 8) % frame_size) == 0) 1174 1174 tx_hdr2 |= 0x80008000; /* Enable padding */ 1175 1175 1176 - skb_linearize(skb); 1177 1176 headroom = skb_headroom(skb); 1178 1177 tailroom = skb_tailroom(skb); 1179 1178 ··· 1316 1317 1, 1, tmp); 1317 1318 1318 1319 dev->net->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | 1319 - NETIF_F_RXCSUM | NETIF_F_SG | NETIF_F_TSO; 1320 + NETIF_F_RXCSUM; 1320 1321 1321 1322 dev->net->hw_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | 1322 - NETIF_F_RXCSUM | NETIF_F_SG | NETIF_F_TSO; 1323 + NETIF_F_RXCSUM; 1323 1324 1324 1325 /* Enable checksum offload */ 1325 1326 *tmp = AX_RXCOE_IP | AX_RXCOE_TCP | AX_RXCOE_UDP |
+3 -9
drivers/net/usb/smsc75xx.c
··· 45 45 #define EEPROM_MAC_OFFSET (0x01) 46 46 #define DEFAULT_TX_CSUM_ENABLE (true) 47 47 #define DEFAULT_RX_CSUM_ENABLE (true) 48 - #define DEFAULT_TSO_ENABLE (true) 49 48 #define SMSC75XX_INTERNAL_PHY_ID (1) 50 49 #define SMSC75XX_TX_OVERHEAD (8) 51 50 #define MAX_RX_FIFO_SIZE (20 * 1024) ··· 1409 1410 1410 1411 INIT_WORK(&pdata->set_multicast, smsc75xx_deferred_multicast_write); 1411 1412 1412 - if (DEFAULT_TX_CSUM_ENABLE) { 1413 + if (DEFAULT_TX_CSUM_ENABLE) 1413 1414 dev->net->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM; 1414 - if (DEFAULT_TSO_ENABLE) 1415 - dev->net->features |= NETIF_F_SG | 1416 - NETIF_F_TSO | NETIF_F_TSO6; 1417 - } 1415 + 1418 1416 if (DEFAULT_RX_CSUM_ENABLE) 1419 1417 dev->net->features |= NETIF_F_RXCSUM; 1420 1418 1421 1419 dev->net->hw_features = NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | 1422 - NETIF_F_SG | NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_RXCSUM; 1420 + NETIF_F_RXCSUM; 1423 1421 1424 1422 ret = smsc75xx_wait_ready(dev, 0); 1425 1423 if (ret < 0) { ··· 2195 2199 struct sk_buff *skb, gfp_t flags) 2196 2200 { 2197 2201 u32 tx_cmd_a, tx_cmd_b; 2198 - 2199 - skb_linearize(skb); 2200 2202 2201 2203 if (skb_headroom(skb) < SMSC75XX_TX_OVERHEAD) { 2202 2204 struct sk_buff *skb2 =