Skip to content

Commit ad7c7b2

Browse files
Stanislav Fomichevkuba-moo
authored andcommitted
net: hold netdev instance lock during sysfs operations
Most of them are already covered by the converted dev_xxx APIs. Add the locking wrappers for the remaining ones. Cc: Saeed Mahameed <[email protected]> Signed-off-by: Stanislav Fomichev <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent ffb7ed1 commit ad7c7b2

File tree

5 files changed

+88
-48
lines changed

5 files changed

+88
-48
lines changed

drivers/net/bonding/bond_main.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2644,10 +2644,13 @@ static int __bond_release_one(struct net_device *bond_dev,
26442644
dev_set_mac_address(slave_dev, (struct sockaddr *)&ss, NULL);
26452645
}
26462646

2647-
if (unregister)
2647+
if (unregister) {
2648+
netdev_lock_ops(slave_dev);
26482649
__dev_set_mtu(slave_dev, slave->original_mtu);
2649-
else
2650+
netdev_unlock_ops(slave_dev);
2651+
} else {
26502652
dev_set_mtu(slave_dev, slave->original_mtu);
2653+
}
26512654

26522655
if (!netif_is_bond_master(slave_dev))
26532656
slave_dev->priv_flags &= ~IFF_BONDING;

include/linux/netdevice.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3382,6 +3382,7 @@ void dev_close(struct net_device *dev);
33823382
void dev_close_many(struct list_head *head, bool unlink);
33833383
int dev_setup_tc(struct net_device *dev, enum tc_setup_type type,
33843384
void *type_data);
3385+
void netif_disable_lro(struct net_device *dev);
33853386
void dev_disable_lro(struct net_device *dev);
33863387
int dev_loopback_xmit(struct net *net, struct sock *sk, struct sk_buff *newskb);
33873388
u16 dev_pick_tx_zero(struct net_device *dev, struct sk_buff *skb,
@@ -4257,6 +4258,8 @@ int netif_set_mtu(struct net_device *dev, int new_mtu);
42574258
int dev_set_mtu(struct net_device *, int);
42584259
int dev_pre_changeaddr_notify(struct net_device *dev, const char *addr,
42594260
struct netlink_ext_ack *extack);
4261+
int netif_set_mac_address(struct net_device *dev, struct sockaddr *sa,
4262+
struct netlink_ext_ack *extack);
42604263
int dev_set_mac_address(struct net_device *dev, struct sockaddr *sa,
42614264
struct netlink_ext_ack *extack);
42624265
int netif_set_mac_address_user(struct net_device *dev, struct sockaddr *sa,
@@ -5016,6 +5019,7 @@ static inline void __dev_mc_unsync(struct net_device *dev,
50165019
/* Functions used for secondary unicast and multicast support */
50175020
void dev_set_rx_mode(struct net_device *dev);
50185021
int dev_set_promiscuity(struct net_device *dev, int inc);
5022+
int netif_set_allmulti(struct net_device *dev, int inc, bool notify);
50195023
int dev_set_allmulti(struct net_device *dev, int inc);
50205024
void netdev_state_change(struct net_device *dev);
50215025
void __netdev_notify_peers(struct net_device *dev);

net/core/dev.c

Lines changed: 12 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1757,15 +1757,7 @@ int dev_setup_tc(struct net_device *dev, enum tc_setup_type type,
17571757
}
17581758
EXPORT_SYMBOL(dev_setup_tc);
17591759

1760-
/**
1761-
* dev_disable_lro - disable Large Receive Offload on a device
1762-
* @dev: device
1763-
*
1764-
* Disable Large Receive Offload (LRO) on a net device. Must be
1765-
* called under RTNL. This is needed if received packets may be
1766-
* forwarded to another interface.
1767-
*/
1768-
void dev_disable_lro(struct net_device *dev)
1760+
void netif_disable_lro(struct net_device *dev)
17691761
{
17701762
struct net_device *lower_dev;
17711763
struct list_head *iter;
@@ -1776,10 +1768,12 @@ void dev_disable_lro(struct net_device *dev)
17761768
if (unlikely(dev->features & NETIF_F_LRO))
17771769
netdev_WARN(dev, "failed to disable LRO!\n");
17781770

1779-
netdev_for_each_lower_dev(dev, lower_dev, iter)
1780-
dev_disable_lro(lower_dev);
1771+
netdev_for_each_lower_dev(dev, lower_dev, iter) {
1772+
netdev_lock_ops(lower_dev);
1773+
netif_disable_lro(lower_dev);
1774+
netdev_unlock_ops(lower_dev);
1775+
}
17811776
}
1782-
EXPORT_SYMBOL(dev_disable_lro);
17831777

17841778
/**
17851779
* dev_disable_gro_hw - disable HW Generic Receive Offload on a device
@@ -6038,7 +6032,7 @@ static int generic_xdp_install(struct net_device *dev, struct netdev_bpf *xdp)
60386032
static_branch_dec(&generic_xdp_needed_key);
60396033
} else if (new && !old) {
60406034
static_branch_inc(&generic_xdp_needed_key);
6041-
dev_disable_lro(dev);
6035+
netif_disable_lro(dev);
60426036
dev_disable_gro_hw(dev);
60436037
}
60446038
break;
@@ -9210,7 +9204,7 @@ int dev_set_promiscuity(struct net_device *dev, int inc)
92109204
}
92119205
EXPORT_SYMBOL(dev_set_promiscuity);
92129206

9213-
static int __dev_set_allmulti(struct net_device *dev, int inc, bool notify)
9207+
int netif_set_allmulti(struct net_device *dev, int inc, bool notify)
92149208
{
92159209
unsigned int old_flags = dev->flags, old_gflags = dev->gflags;
92169210
unsigned int allmulti, flags;
@@ -9245,25 +9239,6 @@ static int __dev_set_allmulti(struct net_device *dev, int inc, bool notify)
92459239
return 0;
92469240
}
92479241

9248-
/**
9249-
* dev_set_allmulti - update allmulti count on a device
9250-
* @dev: device
9251-
* @inc: modifier
9252-
*
9253-
* Add or remove reception of all multicast frames to a device. While the
9254-
* count in the device remains above zero the interface remains listening
9255-
* to all interfaces. Once it hits zero the device reverts back to normal
9256-
* filtering operation. A negative @inc value is used to drop the counter
9257-
* when releasing a resource needing all multicasts.
9258-
* Return 0 if successful or a negative errno code on error.
9259-
*/
9260-
9261-
int dev_set_allmulti(struct net_device *dev, int inc)
9262-
{
9263-
return __dev_set_allmulti(dev, inc, true);
9264-
}
9265-
EXPORT_SYMBOL(dev_set_allmulti);
9266-
92679242
/*
92689243
* Upload unicast and multicast address lists to device and
92699244
* configure RX filtering. When the device doesn't support unicast
@@ -9396,7 +9371,7 @@ int __dev_change_flags(struct net_device *dev, unsigned int flags,
93969371
int inc = (flags & IFF_ALLMULTI) ? 1 : -1;
93979372

93989373
dev->gflags ^= IFF_ALLMULTI;
9399-
__dev_set_allmulti(dev, inc, false);
9374+
netif_set_allmulti(dev, inc, false);
94009375
}
94019376

94029377
return ret;
@@ -9588,16 +9563,8 @@ int dev_pre_changeaddr_notify(struct net_device *dev, const char *addr,
95889563
}
95899564
EXPORT_SYMBOL(dev_pre_changeaddr_notify);
95909565

9591-
/**
9592-
* dev_set_mac_address - Change Media Access Control Address
9593-
* @dev: device
9594-
* @sa: new address
9595-
* @extack: netlink extended ack
9596-
*
9597-
* Change the hardware (MAC) address of the device
9598-
*/
9599-
int dev_set_mac_address(struct net_device *dev, struct sockaddr *sa,
9600-
struct netlink_ext_ack *extack)
9566+
int netif_set_mac_address(struct net_device *dev, struct sockaddr *sa,
9567+
struct netlink_ext_ack *extack)
96019568
{
96029569
const struct net_device_ops *ops = dev->netdev_ops;
96039570
int err;
@@ -9621,7 +9588,6 @@ int dev_set_mac_address(struct net_device *dev, struct sockaddr *sa,
96219588
add_device_randomness(dev->dev_addr, dev->addr_len);
96229589
return 0;
96239590
}
9624-
EXPORT_SYMBOL(dev_set_mac_address);
96259591

96269592
DECLARE_RWSEM(dev_addr_sem);
96279593

@@ -9631,7 +9597,7 @@ int netif_set_mac_address_user(struct net_device *dev, struct sockaddr *sa,
96319597
int ret;
96329598

96339599
down_write(&dev_addr_sem);
9634-
ret = dev_set_mac_address(dev, sa, extack);
9600+
ret = netif_set_mac_address(dev, sa, extack);
96359601
up_write(&dev_addr_sem);
96369602
return ret;
96379603
}

net/core/dev_api.c

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,3 +252,68 @@ int dev_set_mtu(struct net_device *dev, int new_mtu)
252252
return ret;
253253
}
254254
EXPORT_SYMBOL(dev_set_mtu);
255+
256+
/**
257+
* dev_disable_lro() - disable Large Receive Offload on a device
258+
* @dev: device
259+
*
260+
* Disable Large Receive Offload (LRO) on a net device. Must be
261+
* called under RTNL. This is needed if received packets may be
262+
* forwarded to another interface.
263+
*/
264+
void dev_disable_lro(struct net_device *dev)
265+
{
266+
netdev_lock_ops(dev);
267+
netif_disable_lro(dev);
268+
netdev_unlock_ops(dev);
269+
}
270+
EXPORT_SYMBOL(dev_disable_lro);
271+
272+
/**
273+
* dev_set_allmulti() - update allmulti count on a device
274+
* @dev: device
275+
* @inc: modifier
276+
*
277+
* Add or remove reception of all multicast frames to a device. While the
278+
* count in the device remains above zero the interface remains listening
279+
* to all interfaces. Once it hits zero the device reverts back to normal
280+
* filtering operation. A negative @inc value is used to drop the counter
281+
* when releasing a resource needing all multicasts.
282+
*
283+
* Return: 0 on success, -errno on failure.
284+
*/
285+
286+
int dev_set_allmulti(struct net_device *dev, int inc)
287+
{
288+
int ret;
289+
290+
netdev_lock_ops(dev);
291+
ret = netif_set_allmulti(dev, inc, true);
292+
netdev_unlock_ops(dev);
293+
294+
return ret;
295+
}
296+
EXPORT_SYMBOL(dev_set_allmulti);
297+
298+
/**
299+
* dev_set_mac_address() - change Media Access Control Address
300+
* @dev: device
301+
* @sa: new address
302+
* @extack: netlink extended ack
303+
*
304+
* Change the hardware (MAC) address of the device
305+
*
306+
* Return: 0 on success, -errno on failure.
307+
*/
308+
int dev_set_mac_address(struct net_device *dev, struct sockaddr *sa,
309+
struct netlink_ext_ack *extack)
310+
{
311+
int ret;
312+
313+
netdev_lock_ops(dev);
314+
ret = netif_set_mac_address(dev, sa, extack);
315+
netdev_unlock_ops(dev);
316+
317+
return ret;
318+
}
319+
EXPORT_SYMBOL(dev_set_mac_address);

net/core/net-sysfs.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1483,8 +1483,10 @@ static ssize_t tx_maxrate_store(struct kobject *kobj, struct attribute *attr,
14831483
return err;
14841484

14851485
err = -EOPNOTSUPP;
1486+
netdev_lock_ops(dev);
14861487
if (dev->netdev_ops->ndo_set_tx_maxrate)
14871488
err = dev->netdev_ops->ndo_set_tx_maxrate(dev, index, rate);
1489+
netdev_unlock_ops(dev);
14881490

14891491
if (!err) {
14901492
queue->tx_maxrate = rate;

0 commit comments

Comments
 (0)