Skip to content

Commit 6cb6a27

Browse files
osctobedavem330
authored andcommitted
net: Call netdev_features_change() from netdev_update_features()
Issue FEAT_CHANGE notification when features are changed by netdev_update_features(). This will allow changes made by extra constraints on e.g. MTU change to be properly propagated like changes via ethtool. Signed-off-by: Michał Mirosław <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent e9403c8 commit 6cb6a27

File tree

3 files changed

+21
-9
lines changed

3 files changed

+21
-9
lines changed

include/linux/netdevice.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2550,6 +2550,7 @@ static inline u32 netdev_get_wanted_features(struct net_device *dev)
25502550
}
25512551
u32 netdev_increment_features(u32 all, u32 one, u32 mask);
25522552
u32 netdev_fix_features(struct net_device *dev, u32 features);
2553+
int __netdev_update_features(struct net_device *dev);
25532554
void netdev_update_features(struct net_device *dev);
25542555

25552556
void netif_stacked_transfer_operstate(const struct net_device *rootdev,

net/core/dev.c

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5236,7 +5236,7 @@ u32 netdev_fix_features(struct net_device *dev, u32 features)
52365236
}
52375237
EXPORT_SYMBOL(netdev_fix_features);
52385238

5239-
void netdev_update_features(struct net_device *dev)
5239+
int __netdev_update_features(struct net_device *dev)
52405240
{
52415241
u32 features;
52425242
int err = 0;
@@ -5250,20 +5250,31 @@ void netdev_update_features(struct net_device *dev)
52505250
features = netdev_fix_features(dev, features);
52515251

52525252
if (dev->features == features)
5253-
return;
5253+
return 0;
52545254

52555255
netdev_info(dev, "Features changed: 0x%08x -> 0x%08x\n",
52565256
dev->features, features);
52575257

52585258
if (dev->netdev_ops->ndo_set_features)
52595259
err = dev->netdev_ops->ndo_set_features(dev, features);
52605260

5261-
if (!err)
5262-
dev->features = features;
5263-
else if (err < 0)
5261+
if (unlikely(err < 0)) {
52645262
netdev_err(dev,
52655263
"set_features() failed (%d); wanted 0x%08x, left 0x%08x\n",
52665264
err, features, dev->features);
5265+
return -1;
5266+
}
5267+
5268+
if (!err)
5269+
dev->features = features;
5270+
5271+
return 1;
5272+
}
5273+
5274+
void netdev_update_features(struct net_device *dev)
5275+
{
5276+
if (__netdev_update_features(dev))
5277+
netdev_features_change(dev);
52675278
}
52685279
EXPORT_SYMBOL(netdev_update_features);
52695280

@@ -5430,7 +5441,7 @@ int register_netdevice(struct net_device *dev)
54305441
goto err_uninit;
54315442
dev->reg_state = NETREG_REGISTERED;
54325443

5433-
netdev_update_features(dev);
5444+
__netdev_update_features(dev);
54345445

54355446
/*
54365447
* Default initial state at registry is that the

net/core/ethtool.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ static int ethtool_set_features(struct net_device *dev, void __user *useraddr)
317317

318318
dev->wanted_features &= ~features[0].valid;
319319
dev->wanted_features |= features[0].valid & features[0].requested;
320-
netdev_update_features(dev);
320+
__netdev_update_features(dev);
321321

322322
if ((dev->wanted_features ^ dev->features) & features[0].valid)
323323
ret |= ETHTOOL_F_WISH;
@@ -499,7 +499,7 @@ static int ethtool_set_one_feature(struct net_device *dev,
499499
else
500500
dev->wanted_features &= ~mask;
501501

502-
netdev_update_features(dev);
502+
__netdev_update_features(dev);
503503
return 0;
504504
}
505505

@@ -551,7 +551,7 @@ int __ethtool_set_flags(struct net_device *dev, u32 data)
551551
dev->wanted_features =
552552
(dev->wanted_features & ~changed) | data;
553553

554-
netdev_update_features(dev);
554+
__netdev_update_features(dev);
555555

556556
return 0;
557557
}

0 commit comments

Comments
 (0)