diff options
author | Michael Chan <michael.chan@broadcom.com> | 2017-12-16 03:09:41 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-12-19 10:38:36 -0500 |
commit | 56f5aa77cdad1076bea0ae8ddeb74ba68ddc9502 (patch) | |
tree | df729526df5ae648fda3a8ea6586e538e74bb93d | |
parent | fb1f5f79ae96331a0201b4080d34f3bc3b5c0b1d (diff) |
net: Disable GRO_HW when generic XDP is installed on a device.
Hardware should not aggregate any packets when generic XDP is installed.
Cc: Ariel Elior <Ariel.Elior@cavium.com>
Cc: everest-linux-l2@cavium.com
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/core/dev.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 4b43f5dcabcd..c7db39926769 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -1542,6 +1542,23 @@ void dev_disable_lro(struct net_device *dev) | |||
1542 | } | 1542 | } |
1543 | EXPORT_SYMBOL(dev_disable_lro); | 1543 | EXPORT_SYMBOL(dev_disable_lro); |
1544 | 1544 | ||
1545 | /** | ||
1546 | * dev_disable_gro_hw - disable HW Generic Receive Offload on a device | ||
1547 | * @dev: device | ||
1548 | * | ||
1549 | * Disable HW Generic Receive Offload (GRO_HW) on a net device. Must be | ||
1550 | * called under RTNL. This is needed if Generic XDP is installed on | ||
1551 | * the device. | ||
1552 | */ | ||
1553 | static void dev_disable_gro_hw(struct net_device *dev) | ||
1554 | { | ||
1555 | dev->wanted_features &= ~NETIF_F_GRO_HW; | ||
1556 | netdev_update_features(dev); | ||
1557 | |||
1558 | if (unlikely(dev->features & NETIF_F_GRO_HW)) | ||
1559 | netdev_WARN(dev, "failed to disable GRO_HW!\n"); | ||
1560 | } | ||
1561 | |||
1545 | static int call_netdevice_notifier(struct notifier_block *nb, unsigned long val, | 1562 | static int call_netdevice_notifier(struct notifier_block *nb, unsigned long val, |
1546 | struct net_device *dev) | 1563 | struct net_device *dev) |
1547 | { | 1564 | { |
@@ -4564,6 +4581,7 @@ static int generic_xdp_install(struct net_device *dev, struct netdev_bpf *xdp) | |||
4564 | } else if (new && !old) { | 4581 | } else if (new && !old) { |
4565 | static_key_slow_inc(&generic_xdp_needed); | 4582 | static_key_slow_inc(&generic_xdp_needed); |
4566 | dev_disable_lro(dev); | 4583 | dev_disable_lro(dev); |
4584 | dev_disable_gro_hw(dev); | ||
4567 | } | 4585 | } |
4568 | break; | 4586 | break; |
4569 | 4587 | ||