Merge branch 'tso-gso-limit-split'
Jakub Kicinski says: ==================== net: disambiguate the TSO and GSO limits This series separates the device-reported TSO limitations from the user space-controlled GSO limits. It used to be that we only had the former (HW limits) but they were named GSO. This probably lead to confusion and letting user override them. The problem came up in the BIG TCP discussion between Eric and Alex, and seems like something we should address. Targeting net-next because (a) nobody is reporting problems; and (b) there is a tiny but non-zero chance that some actually wants to lift the HW limitations. ==================== Reviewed-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
95730d6570
@ -1419,8 +1419,8 @@ static void bond_compute_features(struct bonding *bond)
|
||||
struct list_head *iter;
|
||||
struct slave *slave;
|
||||
unsigned short max_hard_header_len = ETH_HLEN;
|
||||
unsigned int gso_max_size = GSO_MAX_SIZE;
|
||||
u16 gso_max_segs = GSO_MAX_SEGS;
|
||||
unsigned int tso_max_size = TSO_MAX_SIZE;
|
||||
u16 tso_max_segs = TSO_MAX_SEGS;
|
||||
|
||||
if (!bond_has_slaves(bond))
|
||||
goto done;
|
||||
@ -1449,8 +1449,8 @@ static void bond_compute_features(struct bonding *bond)
|
||||
if (slave->dev->hard_header_len > max_hard_header_len)
|
||||
max_hard_header_len = slave->dev->hard_header_len;
|
||||
|
||||
gso_max_size = min(gso_max_size, slave->dev->gso_max_size);
|
||||
gso_max_segs = min(gso_max_segs, slave->dev->gso_max_segs);
|
||||
tso_max_size = min(tso_max_size, slave->dev->tso_max_size);
|
||||
tso_max_segs = min(tso_max_segs, slave->dev->tso_max_segs);
|
||||
}
|
||||
bond_dev->hard_header_len = max_hard_header_len;
|
||||
|
||||
@ -1463,8 +1463,8 @@ done:
|
||||
bond_dev->hw_enc_features |= xfrm_features;
|
||||
#endif /* CONFIG_XFRM_OFFLOAD */
|
||||
bond_dev->mpls_features = mpls_features;
|
||||
netif_set_gso_max_segs(bond_dev, gso_max_segs);
|
||||
netif_set_gso_max_size(bond_dev, gso_max_size);
|
||||
netif_set_tso_max_segs(bond_dev, tso_max_segs);
|
||||
netif_set_tso_max_size(bond_dev, tso_max_size);
|
||||
|
||||
bond_dev->priv_flags &= ~IFF_XMIT_DST_RELEASE;
|
||||
if ((bond_dev->priv_flags & IFF_XMIT_DST_RELEASE_PERM) &&
|
||||
|
@ -2395,7 +2395,7 @@ static int atl1e_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
|
||||
INIT_WORK(&adapter->reset_task, atl1e_reset_task);
|
||||
INIT_WORK(&adapter->link_chg_task, atl1e_link_chg_task);
|
||||
netif_set_gso_max_size(netdev, MAX_TSO_SEG_SIZE);
|
||||
netif_set_tso_max_size(netdev, MAX_TSO_SEG_SIZE);
|
||||
err = register_netdev(netdev);
|
||||
if (err) {
|
||||
netdev_err(netdev, "register netdevice failed\n");
|
||||
|
@ -3563,7 +3563,7 @@ static int setup_nic_devices(struct octeon_device *octeon_dev)
|
||||
| NETIF_F_TSO | NETIF_F_TSO6
|
||||
| NETIF_F_LRO;
|
||||
}
|
||||
netif_set_gso_max_size(netdev, OCTNIC_GSO_MAX_SIZE);
|
||||
netif_set_tso_max_size(netdev, OCTNIC_GSO_MAX_SIZE);
|
||||
|
||||
/* Copy of transmit encapsulation capabilities:
|
||||
* TSO, TSO6, Checksums for this device
|
||||
|
@ -2094,7 +2094,7 @@ static int setup_nic_devices(struct octeon_device *octeon_dev)
|
||||
| NETIF_F_TSO | NETIF_F_TSO6
|
||||
| NETIF_F_GRO
|
||||
| NETIF_F_LRO;
|
||||
netif_set_gso_max_size(netdev, OCTNIC_GSO_MAX_SIZE);
|
||||
netif_set_tso_max_size(netdev, OCTNIC_GSO_MAX_SIZE);
|
||||
|
||||
/* Copy of transmit encapsulation capabilities:
|
||||
* TSO, TSO6, Checksums for this device
|
||||
|
@ -5204,7 +5204,7 @@ static void be_netdev_init(struct net_device *netdev)
|
||||
|
||||
netdev->flags |= IFF_MULTICAST;
|
||||
|
||||
netif_set_gso_max_size(netdev, BE_MAX_GSO_SIZE - ETH_HLEN);
|
||||
netif_set_tso_max_size(netdev, BE_MAX_GSO_SIZE - ETH_HLEN);
|
||||
|
||||
netdev->netdev_ops = &be_netdev_ops;
|
||||
|
||||
|
@ -3566,7 +3566,7 @@ static int fec_enet_init(struct net_device *ndev)
|
||||
ndev->features |= NETIF_F_HW_VLAN_CTAG_RX;
|
||||
|
||||
if (fep->quirks & FEC_QUIRK_HAS_CSUM) {
|
||||
netif_set_gso_max_segs(ndev, FEC_MAX_TSO_SEGS);
|
||||
netif_set_tso_max_segs(ndev, FEC_MAX_TSO_SEGS);
|
||||
|
||||
/* enable hw accelerator */
|
||||
ndev->features |= (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM
|
||||
|
@ -1782,7 +1782,7 @@ static int hns_nic_set_features(struct net_device *netdev,
|
||||
priv->ops.fill_desc = fill_tso_desc;
|
||||
priv->ops.maybe_stop_tx = hns_nic_maybe_stop_tso;
|
||||
/* The chip only support 7*4096 */
|
||||
netif_set_gso_max_size(netdev, 7 * 4096);
|
||||
netif_set_tso_max_size(netdev, 7 * 4096);
|
||||
} else {
|
||||
priv->ops.fill_desc = fill_v2_desc;
|
||||
priv->ops.maybe_stop_tx = hns_nic_maybe_stop_tx;
|
||||
@ -2168,7 +2168,7 @@ static void hns_nic_set_priv_ops(struct net_device *netdev)
|
||||
priv->ops.fill_desc = fill_tso_desc;
|
||||
priv->ops.maybe_stop_tx = hns_nic_maybe_stop_tso;
|
||||
/* This chip only support 7*4096 */
|
||||
netif_set_gso_max_size(netdev, 7 * 4096);
|
||||
netif_set_tso_max_size(netdev, 7 * 4096);
|
||||
} else {
|
||||
priv->ops.fill_desc = fill_v2_desc;
|
||||
priv->ops.maybe_stop_tx = hns_nic_maybe_stop_tx;
|
||||
|
@ -5051,12 +5051,12 @@ static void ixgbe_configure_dcb(struct ixgbe_adapter *adapter)
|
||||
|
||||
if (!(adapter->flags & IXGBE_FLAG_DCB_ENABLED)) {
|
||||
if (hw->mac.type == ixgbe_mac_82598EB)
|
||||
netif_set_gso_max_size(adapter->netdev, 65536);
|
||||
netif_set_tso_max_size(adapter->netdev, 65536);
|
||||
return;
|
||||
}
|
||||
|
||||
if (hw->mac.type == ixgbe_mac_82598EB)
|
||||
netif_set_gso_max_size(adapter->netdev, 32768);
|
||||
netif_set_tso_max_size(adapter->netdev, 32768);
|
||||
|
||||
#ifdef IXGBE_FCOE
|
||||
if (adapter->netdev->features & NETIF_F_FCOE_MTU)
|
||||
|
@ -3207,7 +3207,7 @@ static int mv643xx_eth_probe(struct platform_device *pdev)
|
||||
dev->hw_features = dev->features;
|
||||
|
||||
dev->priv_flags |= IFF_UNICAST_FLT;
|
||||
netif_set_gso_max_segs(dev, MV643XX_MAX_TSO_SEGS);
|
||||
netif_set_tso_max_segs(dev, MV643XX_MAX_TSO_SEGS);
|
||||
|
||||
/* MTU range: 64 - 9500 */
|
||||
dev->min_mtu = 64;
|
||||
|
@ -5617,7 +5617,7 @@ static int mvneta_probe(struct platform_device *pdev)
|
||||
dev->hw_features |= dev->features;
|
||||
dev->vlan_features |= dev->features;
|
||||
dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
|
||||
netif_set_gso_max_segs(dev, MVNETA_MAX_TSO_SEGS);
|
||||
netif_set_tso_max_segs(dev, MVNETA_MAX_TSO_SEGS);
|
||||
|
||||
/* MTU range: 68 - 9676 */
|
||||
dev->min_mtu = ETH_MIN_MTU;
|
||||
|
@ -6861,7 +6861,7 @@ static int mvpp2_port_probe(struct platform_device *pdev,
|
||||
mvpp2_set_hw_csum(port, port->pool_long->id);
|
||||
|
||||
dev->vlan_features |= features;
|
||||
netif_set_gso_max_segs(dev, MVPP2_MAX_TSO_SEGS);
|
||||
netif_set_tso_max_segs(dev, MVPP2_MAX_TSO_SEGS);
|
||||
dev->priv_flags |= IFF_UNICAST_FLT;
|
||||
|
||||
/* MTU range: 68 - 9704 */
|
||||
|
@ -2704,7 +2704,7 @@ static int otx2_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
|
||||
netdev->hw_features |= NETIF_F_LOOPBACK | NETIF_F_RXALL;
|
||||
|
||||
netif_set_gso_max_segs(netdev, OTX2_MAX_GSO_SEGS);
|
||||
netif_set_tso_max_segs(netdev, OTX2_MAX_GSO_SEGS);
|
||||
netdev->watchdog_timeo = OTX2_TX_TIMEOUT;
|
||||
|
||||
netdev->netdev_ops = &otx2_netdev_ops;
|
||||
|
@ -652,7 +652,7 @@ static int otx2vf_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
netdev->hw_features |= NETIF_F_RXALL;
|
||||
netdev->hw_features |= NETIF_F_HW_TC;
|
||||
|
||||
netif_set_gso_max_segs(netdev, OTX2_MAX_GSO_SEGS);
|
||||
netif_set_tso_max_segs(netdev, OTX2_MAX_GSO_SEGS);
|
||||
netdev->watchdog_timeo = OTX2_TX_TIMEOUT;
|
||||
|
||||
netdev->netdev_ops = &otx2vf_netdev_ops;
|
||||
|
@ -2320,7 +2320,7 @@ static void nfp_net_netdev_init(struct nfp_net *nn)
|
||||
netdev->min_mtu = ETH_MIN_MTU;
|
||||
netdev->max_mtu = nn->max_mtu;
|
||||
|
||||
netif_set_gso_max_segs(netdev, NFP_NET_LSO_MAX_SEGS);
|
||||
netif_set_tso_max_segs(netdev, NFP_NET_LSO_MAX_SEGS);
|
||||
|
||||
netif_carrier_off(netdev);
|
||||
|
||||
|
@ -286,8 +286,7 @@ nfp_repr_transfer_features(struct net_device *netdev, struct net_device *lower)
|
||||
if (repr->dst->u.port_info.lower_dev != lower)
|
||||
return;
|
||||
|
||||
netif_set_gso_max_size(netdev, lower->gso_max_size);
|
||||
netif_set_gso_max_segs(netdev, lower->gso_max_segs);
|
||||
netif_inherit_tso_max(netdev, lower);
|
||||
|
||||
netdev_update_features(netdev);
|
||||
}
|
||||
@ -381,7 +380,7 @@ int nfp_repr_init(struct nfp_app *app, struct net_device *netdev,
|
||||
|
||||
/* Advertise but disable TSO by default. */
|
||||
netdev->features &= ~(NETIF_F_TSO | NETIF_F_TSO6);
|
||||
netif_set_gso_max_segs(netdev, NFP_NET_LSO_MAX_SEGS);
|
||||
netif_set_tso_max_segs(netdev, NFP_NET_LSO_MAX_SEGS);
|
||||
|
||||
netdev->priv_flags |= IFF_NO_QUEUE | IFF_DISABLE_NETPOLL;
|
||||
netdev->features |= NETIF_F_LLTX;
|
||||
|
@ -5442,12 +5442,12 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
*/
|
||||
if (rtl_chip_supports_csum_v2(tp)) {
|
||||
dev->hw_features |= NETIF_F_SG | NETIF_F_TSO | NETIF_F_TSO6;
|
||||
netif_set_gso_max_size(dev, RTL_GSO_MAX_SIZE_V2);
|
||||
netif_set_gso_max_segs(dev, RTL_GSO_MAX_SEGS_V2);
|
||||
netif_set_tso_max_size(dev, RTL_GSO_MAX_SIZE_V2);
|
||||
netif_set_tso_max_segs(dev, RTL_GSO_MAX_SEGS_V2);
|
||||
} else {
|
||||
dev->hw_features |= NETIF_F_SG | NETIF_F_TSO;
|
||||
netif_set_gso_max_size(dev, RTL_GSO_MAX_SIZE_V1);
|
||||
netif_set_gso_max_segs(dev, RTL_GSO_MAX_SEGS_V1);
|
||||
netif_set_tso_max_size(dev, RTL_GSO_MAX_SIZE_V1);
|
||||
netif_set_tso_max_segs(dev, RTL_GSO_MAX_SEGS_V1);
|
||||
}
|
||||
|
||||
dev->hw_features |= NETIF_F_RXALL;
|
||||
|
@ -1009,11 +1009,13 @@ static int ef100_process_design_param(struct efx_nic *efx,
|
||||
return 0;
|
||||
case ESE_EF100_DP_GZ_TSO_MAX_PAYLOAD_LEN:
|
||||
nic_data->tso_max_payload_len = min_t(u64, reader->value, GSO_MAX_SIZE);
|
||||
netif_set_gso_max_size(efx->net_dev, nic_data->tso_max_payload_len);
|
||||
netif_set_tso_max_size(efx->net_dev,
|
||||
nic_data->tso_max_payload_len);
|
||||
return 0;
|
||||
case ESE_EF100_DP_GZ_TSO_MAX_PAYLOAD_NUM_SEGS:
|
||||
nic_data->tso_max_payload_num_segs = min_t(u64, reader->value, 0xffff);
|
||||
netif_set_gso_max_segs(efx->net_dev, nic_data->tso_max_payload_num_segs);
|
||||
netif_set_tso_max_segs(efx->net_dev,
|
||||
nic_data->tso_max_payload_num_segs);
|
||||
return 0;
|
||||
case ESE_EF100_DP_GZ_TSO_MAX_NUM_FRAMES:
|
||||
nic_data->tso_max_frames = min_t(u64, reader->value, 0xffff);
|
||||
@ -1138,7 +1140,8 @@ static int ef100_probe_main(struct efx_nic *efx)
|
||||
nic_data->tso_max_frames = ESE_EF100_DP_GZ_TSO_MAX_NUM_FRAMES_DEFAULT;
|
||||
nic_data->tso_max_payload_num_segs = ESE_EF100_DP_GZ_TSO_MAX_PAYLOAD_NUM_SEGS_DEFAULT;
|
||||
nic_data->tso_max_payload_len = ESE_EF100_DP_GZ_TSO_MAX_PAYLOAD_LEN_DEFAULT;
|
||||
netif_set_gso_max_segs(net_dev, ESE_EF100_DP_GZ_TSO_MAX_HDR_NUM_SEGS_DEFAULT);
|
||||
netif_set_tso_max_segs(net_dev,
|
||||
ESE_EF100_DP_GZ_TSO_MAX_HDR_NUM_SEGS_DEFAULT);
|
||||
/* Read design parameters */
|
||||
rc = ef100_check_design_params(efx);
|
||||
if (rc) {
|
||||
|
@ -710,7 +710,7 @@ static int efx_register_netdev(struct efx_nic *efx)
|
||||
if (efx_nic_rev(efx) >= EFX_REV_HUNT_A0)
|
||||
net_dev->priv_flags |= IFF_UNICAST_FLT;
|
||||
net_dev->ethtool_ops = &efx_ethtool_ops;
|
||||
netif_set_gso_max_segs(net_dev, EFX_TSO_MAX_SEGS);
|
||||
netif_set_tso_max_segs(net_dev, EFX_TSO_MAX_SEGS);
|
||||
net_dev->min_mtu = EFX_MIN_MTU;
|
||||
net_dev->max_mtu = EFX_MAX_MTU;
|
||||
|
||||
|
@ -2267,7 +2267,7 @@ static int ef4_register_netdev(struct ef4_nic *efx)
|
||||
net_dev->irq = efx->pci_dev->irq;
|
||||
net_dev->netdev_ops = &ef4_netdev_ops;
|
||||
net_dev->ethtool_ops = &ef4_ethtool_ops;
|
||||
netif_set_gso_max_segs(net_dev, EF4_TSO_MAX_SEGS);
|
||||
netif_set_tso_max_segs(net_dev, EF4_TSO_MAX_SEGS);
|
||||
net_dev->min_mtu = EF4_MIN_MTU;
|
||||
net_dev->max_mtu = EF4_MAX_MTU;
|
||||
|
||||
|
@ -1431,7 +1431,7 @@ static int rndis_netdev_set_hwcaps(struct rndis_device *rndis_device,
|
||||
*/
|
||||
net->features &= ~NETVSC_SUPPORTED_HW_FEATURES | net->hw_features;
|
||||
|
||||
netif_set_gso_max_size(net, gso_max_size);
|
||||
netif_set_tso_max_size(net, gso_max_size);
|
||||
|
||||
ret = rndis_filter_set_offload_params(net, nvdev, &offloads);
|
||||
|
||||
|
@ -139,8 +139,7 @@ static int ipvlan_init(struct net_device *dev)
|
||||
dev->vlan_features = phy_dev->vlan_features & IPVLAN_FEATURES;
|
||||
dev->vlan_features |= IPVLAN_ALWAYS_ON_OFLOADS;
|
||||
dev->hw_enc_features |= dev->features;
|
||||
netif_set_gso_max_size(dev, phy_dev->gso_max_size);
|
||||
netif_set_gso_max_segs(dev, phy_dev->gso_max_segs);
|
||||
netif_inherit_tso_max(dev, phy_dev);
|
||||
dev->hard_header_len = phy_dev->hard_header_len;
|
||||
|
||||
netdev_lockdep_set_classes(dev);
|
||||
@ -762,8 +761,7 @@ static int ipvlan_device_event(struct notifier_block *unused,
|
||||
|
||||
case NETDEV_FEAT_CHANGE:
|
||||
list_for_each_entry(ipvlan, &port->ipvlans, pnode) {
|
||||
netif_set_gso_max_size(ipvlan->dev, dev->gso_max_size);
|
||||
netif_set_gso_max_segs(ipvlan->dev, dev->gso_max_segs);
|
||||
netif_inherit_tso_max(ipvlan->dev, dev);
|
||||
netdev_update_features(ipvlan->dev);
|
||||
}
|
||||
break;
|
||||
|
@ -904,8 +904,7 @@ static int macvlan_init(struct net_device *dev)
|
||||
dev->vlan_features = lowerdev->vlan_features & MACVLAN_FEATURES;
|
||||
dev->vlan_features |= ALWAYS_ON_OFFLOADS;
|
||||
dev->hw_enc_features |= dev->features;
|
||||
netif_set_gso_max_size(dev, lowerdev->gso_max_size);
|
||||
netif_set_gso_max_segs(dev, lowerdev->gso_max_segs);
|
||||
netif_inherit_tso_max(dev, lowerdev);
|
||||
dev->hard_header_len = lowerdev->hard_header_len;
|
||||
macvlan_set_lockdep_class(dev);
|
||||
|
||||
@ -1763,8 +1762,7 @@ static int macvlan_device_event(struct notifier_block *unused,
|
||||
break;
|
||||
case NETDEV_FEAT_CHANGE:
|
||||
list_for_each_entry(vlan, &port->vlans, list) {
|
||||
netif_set_gso_max_size(vlan->dev, dev->gso_max_size);
|
||||
netif_set_gso_max_segs(vlan->dev, dev->gso_max_segs);
|
||||
netif_inherit_tso_max(vlan->dev, dev);
|
||||
netdev_update_features(vlan->dev);
|
||||
}
|
||||
break;
|
||||
|
@ -735,7 +735,7 @@ static int aqc111_bind(struct usbnet *dev, struct usb_interface *intf)
|
||||
dev->net->features |= AQ_SUPPORT_FEATURE;
|
||||
dev->net->vlan_features |= AQ_SUPPORT_VLAN_FEATURE;
|
||||
|
||||
netif_set_gso_max_size(dev->net, 65535);
|
||||
netif_set_tso_max_size(dev->net, 65535);
|
||||
|
||||
aqc111_read_fw_version(dev, aqc111_data);
|
||||
aqc111_data->autoneg = AUTONEG_ENABLE;
|
||||
|
@ -1382,7 +1382,7 @@ static int ax88179_bind(struct usbnet *dev, struct usb_interface *intf)
|
||||
|
||||
dev->net->hw_features |= dev->net->features;
|
||||
|
||||
netif_set_gso_max_size(dev->net, 16384);
|
||||
netif_set_tso_max_size(dev->net, 16384);
|
||||
|
||||
/* Enable checksum offload */
|
||||
*tmp = AX_RXCOE_IP | AX_RXCOE_TCP | AX_RXCOE_UDP |
|
||||
|
@ -4372,7 +4372,7 @@ static int lan78xx_probe(struct usb_interface *intf,
|
||||
/* MTU range: 68 - 9000 */
|
||||
netdev->max_mtu = MAX_SINGLE_PACKET_SIZE;
|
||||
|
||||
netif_set_gso_max_size(netdev, LAN78XX_TSO_SIZE(dev));
|
||||
netif_set_tso_max_size(netdev, LAN78XX_TSO_SIZE(dev));
|
||||
|
||||
netif_napi_add(netdev, &dev->napi, lan78xx_poll, NAPI_POLL_WEIGHT);
|
||||
|
||||
|
@ -9658,7 +9658,7 @@ static int rtl8152_probe(struct usb_interface *intf,
|
||||
}
|
||||
|
||||
netdev->ethtool_ops = &ops;
|
||||
netif_set_gso_max_size(netdev, RTL_LIMITED_TSO_SIZE);
|
||||
netif_set_tso_max_size(netdev, RTL_LIMITED_TSO_SIZE);
|
||||
|
||||
/* MTU range: 68 - 1500 or 9194 */
|
||||
netdev->min_mtu = ETH_MIN_MTU;
|
||||
|
@ -1758,8 +1758,7 @@ static int veth_newlink(struct net *src_net, struct net_device *dev,
|
||||
if (ifmp && (dev->ifindex != 0))
|
||||
peer->ifindex = ifmp->ifi_index;
|
||||
|
||||
netif_set_gso_max_size(peer, dev->gso_max_size);
|
||||
netif_set_gso_max_segs(peer, dev->gso_max_segs);
|
||||
netif_inherit_tso_max(peer, dev);
|
||||
|
||||
err = register_netdevice(peer);
|
||||
put_net(net);
|
||||
|
@ -3683,8 +3683,7 @@ static void vxlan_config_apply(struct net_device *dev,
|
||||
if (lowerdev) {
|
||||
dst->remote_ifindex = conf->remote_ifindex;
|
||||
|
||||
netif_set_gso_max_size(dev, lowerdev->gso_max_size);
|
||||
netif_set_gso_max_segs(dev, lowerdev->gso_max_segs);
|
||||
netif_inherit_tso_max(dev, lowerdev);
|
||||
|
||||
needed_headroom = lowerdev->hard_header_len;
|
||||
needed_headroom += lowerdev->needed_headroom;
|
||||
|
@ -1129,7 +1129,7 @@ static int qeth_l2_setup_netdev(struct qeth_card *card)
|
||||
if (card->dev->hw_features & (NETIF_F_TSO | NETIF_F_TSO6)) {
|
||||
card->dev->needed_headroom = sizeof(struct qeth_hdr_tso);
|
||||
netif_keep_dst(card->dev);
|
||||
netif_set_gso_max_size(card->dev,
|
||||
netif_set_tso_max_size(card->dev,
|
||||
PAGE_SIZE * (QDIO_MAX_ELEMENTS_PER_BUFFER - 1));
|
||||
}
|
||||
|
||||
|
@ -1907,7 +1907,7 @@ static int qeth_l3_setup_netdev(struct qeth_card *card)
|
||||
|
||||
netif_keep_dst(card->dev);
|
||||
if (card->dev->hw_features & (NETIF_F_TSO | NETIF_F_TSO6))
|
||||
netif_set_gso_max_size(card->dev,
|
||||
netif_set_tso_max_size(card->dev,
|
||||
PAGE_SIZE * (QETH_MAX_BUFFER_ELEMENTS(card) - 1));
|
||||
|
||||
netif_napi_add(card->dev, &card->napi, qeth_poll, NAPI_POLL_WEIGHT);
|
||||
|
@ -1917,8 +1917,10 @@ enum netdev_ml_priv_type {
|
||||
* @rtnl_link_ops: Rtnl_link_ops
|
||||
*
|
||||
* @gso_max_size: Maximum size of generic segmentation offload
|
||||
* @tso_max_size: Device (as in HW) limit on the max TSO request size
|
||||
* @gso_max_segs: Maximum number of segments that can be passed to the
|
||||
* NIC for GSO
|
||||
* @tso_max_segs: Device (as in HW) limit on the max TSO segment count
|
||||
*
|
||||
* @dcbnl_ops: Data Center Bridging netlink ops
|
||||
* @num_tc: Number of traffic classes in the net device
|
||||
@ -2262,8 +2264,13 @@ struct net_device {
|
||||
/* for setting kernel sock attribute on TCP connection setup */
|
||||
#define GSO_MAX_SIZE 65536
|
||||
unsigned int gso_max_size;
|
||||
#define TSO_LEGACY_MAX_SIZE 65536
|
||||
#define TSO_MAX_SIZE UINT_MAX
|
||||
unsigned int tso_max_size;
|
||||
#define GSO_MAX_SEGS 65535
|
||||
u16 gso_max_segs;
|
||||
#define TSO_MAX_SEGS U16_MAX
|
||||
u16 tso_max_segs;
|
||||
|
||||
#ifdef CONFIG_DCB
|
||||
const struct dcbnl_rtnl_ops *dcbnl_ops;
|
||||
@ -4874,26 +4881,10 @@ static inline bool netif_needs_gso(struct sk_buff *skb,
|
||||
(skb->ip_summed != CHECKSUM_UNNECESSARY)));
|
||||
}
|
||||
|
||||
static inline void netif_set_gso_max_size(struct net_device *dev,
|
||||
unsigned int size)
|
||||
{
|
||||
/* dev->gso_max_size is read locklessly from sk_setup_caps() */
|
||||
WRITE_ONCE(dev->gso_max_size, size);
|
||||
}
|
||||
|
||||
static inline void netif_set_gso_max_segs(struct net_device *dev,
|
||||
unsigned int segs)
|
||||
{
|
||||
/* dev->gso_max_segs is read locklessly from sk_setup_caps() */
|
||||
WRITE_ONCE(dev->gso_max_segs, segs);
|
||||
}
|
||||
|
||||
static inline void netif_set_gro_max_size(struct net_device *dev,
|
||||
unsigned int size)
|
||||
{
|
||||
/* This pairs with the READ_ONCE() in skb_gro_receive() */
|
||||
WRITE_ONCE(dev->gro_max_size, size);
|
||||
}
|
||||
void netif_set_tso_max_size(struct net_device *dev, unsigned int size);
|
||||
void netif_set_tso_max_segs(struct net_device *dev, unsigned int segs);
|
||||
void netif_inherit_tso_max(struct net_device *to,
|
||||
const struct net_device *from);
|
||||
|
||||
static inline void skb_gso_error_unwind(struct sk_buff *skb, __be16 protocol,
|
||||
int pulled_hlen, u16 mac_offset,
|
||||
|
@ -319,8 +319,7 @@ static void vlan_transfer_features(struct net_device *dev,
|
||||
{
|
||||
struct vlan_dev_priv *vlan = vlan_dev_priv(vlandev);
|
||||
|
||||
netif_set_gso_max_size(vlandev, dev->gso_max_size);
|
||||
netif_set_gso_max_segs(vlandev, dev->gso_max_segs);
|
||||
netif_inherit_tso_max(vlandev, dev);
|
||||
|
||||
if (vlan_hw_offload_capable(dev->features, vlan->vlan_proto))
|
||||
vlandev->hard_header_len = dev->hard_header_len;
|
||||
|
@ -573,8 +573,7 @@ static int vlan_dev_init(struct net_device *dev)
|
||||
NETIF_F_ALL_FCOE;
|
||||
|
||||
dev->features |= dev->hw_features | NETIF_F_LLTX;
|
||||
netif_set_gso_max_size(dev, real_dev->gso_max_size);
|
||||
netif_set_gso_max_segs(dev, real_dev->gso_max_segs);
|
||||
netif_inherit_tso_max(dev, real_dev);
|
||||
if (dev->features & NETIF_F_VLAN_FEATURES)
|
||||
netdev_warn(real_dev, "VLAN features are set incorrectly. Q-in-Q configurations may not work correctly.\n");
|
||||
|
||||
|
@ -517,16 +517,16 @@ void br_mtu_auto_adjust(struct net_bridge *br)
|
||||
|
||||
static void br_set_gso_limits(struct net_bridge *br)
|
||||
{
|
||||
unsigned int gso_max_size = GSO_MAX_SIZE;
|
||||
u16 gso_max_segs = GSO_MAX_SEGS;
|
||||
unsigned int tso_max_size = TSO_MAX_SIZE;
|
||||
const struct net_bridge_port *p;
|
||||
u16 tso_max_segs = TSO_MAX_SEGS;
|
||||
|
||||
list_for_each_entry(p, &br->port_list, list) {
|
||||
gso_max_size = min(gso_max_size, p->dev->gso_max_size);
|
||||
gso_max_segs = min(gso_max_segs, p->dev->gso_max_segs);
|
||||
tso_max_size = min(tso_max_size, p->dev->tso_max_size);
|
||||
tso_max_segs = min(tso_max_segs, p->dev->tso_max_segs);
|
||||
}
|
||||
netif_set_gso_max_size(br->dev, gso_max_size);
|
||||
netif_set_gso_max_segs(br->dev, gso_max_segs);
|
||||
netif_set_tso_max_size(br->dev, tso_max_size);
|
||||
netif_set_tso_max_segs(br->dev, tso_max_segs);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -2992,6 +2992,51 @@ undo_rx:
|
||||
}
|
||||
EXPORT_SYMBOL(netif_set_real_num_queues);
|
||||
|
||||
/**
|
||||
* netif_set_tso_max_size() - set the max size of TSO frames supported
|
||||
* @dev: netdev to update
|
||||
* @size: max skb->len of a TSO frame
|
||||
*
|
||||
* Set the limit on the size of TSO super-frames the device can handle.
|
||||
* Unless explicitly set the stack will assume the value of %GSO_MAX_SIZE.
|
||||
*/
|
||||
void netif_set_tso_max_size(struct net_device *dev, unsigned int size)
|
||||
{
|
||||
dev->tso_max_size = size;
|
||||
if (size < READ_ONCE(dev->gso_max_size))
|
||||
netif_set_gso_max_size(dev, size);
|
||||
}
|
||||
EXPORT_SYMBOL(netif_set_tso_max_size);
|
||||
|
||||
/**
|
||||
* netif_set_tso_max_segs() - set the max number of segs supported for TSO
|
||||
* @dev: netdev to update
|
||||
* @segs: max number of TCP segments
|
||||
*
|
||||
* Set the limit on the number of TCP segments the device can generate from
|
||||
* a single TSO super-frame.
|
||||
* Unless explicitly set the stack will assume the value of %GSO_MAX_SEGS.
|
||||
*/
|
||||
void netif_set_tso_max_segs(struct net_device *dev, unsigned int segs)
|
||||
{
|
||||
dev->tso_max_segs = segs;
|
||||
if (segs < READ_ONCE(dev->gso_max_segs))
|
||||
netif_set_gso_max_segs(dev, segs);
|
||||
}
|
||||
EXPORT_SYMBOL(netif_set_tso_max_segs);
|
||||
|
||||
/**
|
||||
* netif_inherit_tso_max() - copy all TSO limits from a lower device to an upper
|
||||
* @to: netdev to update
|
||||
* @from: netdev from which to copy the limits
|
||||
*/
|
||||
void netif_inherit_tso_max(struct net_device *to, const struct net_device *from)
|
||||
{
|
||||
netif_set_tso_max_size(to, from->tso_max_size);
|
||||
netif_set_tso_max_segs(to, from->tso_max_segs);
|
||||
}
|
||||
EXPORT_SYMBOL(netif_inherit_tso_max);
|
||||
|
||||
/**
|
||||
* netif_get_num_default_rss_queues - default number of RSS queues
|
||||
*
|
||||
@ -10560,6 +10605,8 @@ struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name,
|
||||
dev->gso_max_size = GSO_MAX_SIZE;
|
||||
dev->gso_max_segs = GSO_MAX_SEGS;
|
||||
dev->gro_max_size = GRO_MAX_SIZE;
|
||||
dev->tso_max_size = TSO_LEGACY_MAX_SIZE;
|
||||
dev->tso_max_segs = TSO_MAX_SEGS;
|
||||
dev->upper_level = 1;
|
||||
dev->lower_level = 1;
|
||||
#ifdef CONFIG_LOCKDEP
|
||||
|
@ -88,4 +88,25 @@ int dev_change_carrier(struct net_device *dev, bool new_carrier);
|
||||
|
||||
void __dev_set_rx_mode(struct net_device *dev);
|
||||
|
||||
static inline void netif_set_gso_max_size(struct net_device *dev,
|
||||
unsigned int size)
|
||||
{
|
||||
/* dev->gso_max_size is read locklessly from sk_setup_caps() */
|
||||
WRITE_ONCE(dev->gso_max_size, size);
|
||||
}
|
||||
|
||||
static inline void netif_set_gso_max_segs(struct net_device *dev,
|
||||
unsigned int segs)
|
||||
{
|
||||
/* dev->gso_max_segs is read locklessly from sk_setup_caps() */
|
||||
WRITE_ONCE(dev->gso_max_segs, segs);
|
||||
}
|
||||
|
||||
static inline void netif_set_gro_max_size(struct net_device *dev,
|
||||
unsigned int size)
|
||||
{
|
||||
/* This pairs with the READ_ONCE() in skb_gro_receive() */
|
||||
WRITE_ONCE(dev->gro_max_size, size);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -2803,7 +2803,7 @@ static int do_setlink(const struct sk_buff *skb,
|
||||
if (tb[IFLA_GSO_MAX_SIZE]) {
|
||||
u32 max_size = nla_get_u32(tb[IFLA_GSO_MAX_SIZE]);
|
||||
|
||||
if (max_size > GSO_MAX_SIZE) {
|
||||
if (max_size > GSO_MAX_SIZE || max_size > dev->tso_max_size) {
|
||||
err = -EINVAL;
|
||||
goto errout;
|
||||
}
|
||||
@ -2817,7 +2817,7 @@ static int do_setlink(const struct sk_buff *skb,
|
||||
if (tb[IFLA_GSO_MAX_SEGS]) {
|
||||
u32 max_segs = nla_get_u32(tb[IFLA_GSO_MAX_SEGS]);
|
||||
|
||||
if (max_segs > GSO_MAX_SEGS) {
|
||||
if (max_segs > GSO_MAX_SEGS || max_segs > dev->tso_max_segs) {
|
||||
err = -EINVAL;
|
||||
goto errout;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user