Skip to content

Commit 62dbe83

Browse files
mkubecekdavem330
authored andcommitted
macvlan: allow setting LRO independently of lower device
Since commit fbe168b ("net: generic dev_disable_lro() stacked device handling"), dev_disable_lro() zeroes NETIF_F_LRO feature flag first for a macvlan device and then for its lower device. As an attempt to set NETIF_F_LRO to zero is ignored, dev_disable_lro() issues a warning and taints kernel. Allowing NETIF_F_LRO to be set independently of the lower device consists of three parts: - add the flag to hw_features to allow toggling it - allow setting it to 0 even if lower device has the flag set - add the flag to MACVLAN_FEATURES to restore copying from lower device on macvlan creation Signed-off-by: Michal Kubecek <mkubecek@suse.cz> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent bd42b78 commit 62dbe83

File tree

1 file changed

+5
-4
lines changed

1 file changed

+5
-4
lines changed

drivers/net/macvlan.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -747,7 +747,7 @@ static struct lock_class_key macvlan_netdev_addr_lock_key;
747747

748748
#define MACVLAN_FEATURES \
749749
(NETIF_F_SG | NETIF_F_ALL_CSUM | NETIF_F_HIGHDMA | NETIF_F_FRAGLIST | \
750-
NETIF_F_GSO | NETIF_F_TSO | NETIF_F_UFO | \
750+
NETIF_F_GSO | NETIF_F_TSO | NETIF_F_UFO | NETIF_F_LRO | \
751751
NETIF_F_TSO_ECN | NETIF_F_TSO6 | NETIF_F_GRO | NETIF_F_RXCSUM | \
752752
NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_HW_VLAN_STAG_FILTER)
753753

@@ -784,6 +784,7 @@ static int macvlan_init(struct net_device *dev)
784784
(lowerdev->state & MACVLAN_STATE_MASK);
785785
dev->features = lowerdev->features & MACVLAN_FEATURES;
786786
dev->features |= ALWAYS_ON_FEATURES;
787+
dev->hw_features |= NETIF_F_LRO;
787788
dev->vlan_features = lowerdev->vlan_features & MACVLAN_FEATURES;
788789
dev->gso_max_size = lowerdev->gso_max_size;
789790
dev->iflink = lowerdev->ifindex;
@@ -936,15 +937,15 @@ static netdev_features_t macvlan_fix_features(struct net_device *dev,
936937
netdev_features_t features)
937938
{
938939
struct macvlan_dev *vlan = netdev_priv(dev);
940+
netdev_features_t lowerdev_features = vlan->lowerdev->features;
939941
netdev_features_t mask;
940942

941943
features |= NETIF_F_ALL_FOR_ALL;
942944
features &= (vlan->set_features | ~MACVLAN_FEATURES);
943945
mask = features;
944946

945-
features = netdev_increment_features(vlan->lowerdev->features,
946-
features,
947-
mask);
947+
lowerdev_features &= (features | ~NETIF_F_LRO);
948+
features = netdev_increment_features(lowerdev_features, features, mask);
948949
features |= ALWAYS_ON_FEATURES;
949950
features &= ~NETIF_F_NETNS_LOCAL;
950951

0 commit comments

Comments
 (0)