Commit d2692eee authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller

net: typhoon: implement ndo_features_check method

Instead of disabling TSO at compile time if MAX_SKB_FRAGS > 32,
implement ndo_features_check() method for this driver for
a more dynamic handling.

If skb has more than 32 frags and is a GSO packet, force
software segmentation.

Most locally generated packets will use a small number
of fragments anyway.

For forwarding workloads, we can limit gro_max_size at ingress,
we might also implement gro_max_segs if needed.
Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 5f215513
...@@ -138,11 +138,6 @@ MODULE_PARM_DESC(use_mmio, "Use MMIO (1) or PIO(0) to access the NIC. " ...@@ -138,11 +138,6 @@ MODULE_PARM_DESC(use_mmio, "Use MMIO (1) or PIO(0) to access the NIC. "
module_param(rx_copybreak, int, 0); module_param(rx_copybreak, int, 0);
module_param(use_mmio, int, 0); module_param(use_mmio, int, 0);
#if defined(NETIF_F_TSO) && MAX_SKB_FRAGS > 32
#warning Typhoon only supports 32 entries in its SG list for TSO, disabling TSO
#undef NETIF_F_TSO
#endif
#if TXLO_ENTRIES <= (2 * MAX_SKB_FRAGS) #if TXLO_ENTRIES <= (2 * MAX_SKB_FRAGS)
#error TX ring too small! #error TX ring too small!
#endif #endif
...@@ -2261,9 +2256,25 @@ typhoon_test_mmio(struct pci_dev *pdev) ...@@ -2261,9 +2256,25 @@ typhoon_test_mmio(struct pci_dev *pdev)
return mode; return mode;
} }
#if MAX_SKB_FRAGS > 32
static netdev_features_t typhoon_features_check(struct sk_buff *skb,
struct net_device *dev,
netdev_features_t features)
{
if (skb_shinfo(skb)->nr_frags > 32 && skb_is_gso(skb))
features &= ~NETIF_F_GSO_MASK;
features = vlan_features_check(skb, features);
return vxlan_features_check(skb, features);
}
#endif
static const struct net_device_ops typhoon_netdev_ops = { static const struct net_device_ops typhoon_netdev_ops = {
.ndo_open = typhoon_open, .ndo_open = typhoon_open,
.ndo_stop = typhoon_close, .ndo_stop = typhoon_close,
#if MAX_SKB_FRAGS > 32
.ndo_features_check = typhoon_features_check,
#endif
.ndo_start_xmit = typhoon_start_tx, .ndo_start_xmit = typhoon_start_tx,
.ndo_set_rx_mode = typhoon_set_rx_mode, .ndo_set_rx_mode = typhoon_set_rx_mode,
.ndo_tx_timeout = typhoon_tx_timeout, .ndo_tx_timeout = typhoon_tx_timeout,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment