Skip to content

Commit 8d8b1a4

Browse files
Eric Dumazetkuba-moo
authored andcommitted
net: annotate data-races around dev->if_port
Various ndo_set_config() methods can change dev->if_port dev->if_port is going to be read locklessly from rtnl_fill_link_ifmap(). Add corresponding WRITE_ONCE() on writer sides. Signed-off-by: Eric Dumazet <[email protected]> Reviewed-by: Simon Horman <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent e2d09e5 commit 8d8b1a4

File tree

7 files changed

+10
-10
lines changed

7 files changed

+10
-10
lines changed

drivers/net/ethernet/3com/3c589_cs.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -502,7 +502,7 @@ static int el3_config(struct net_device *dev, struct ifmap *map)
502502
{
503503
if ((map->port != (u_char)(-1)) && (map->port != dev->if_port)) {
504504
if (map->port <= 3) {
505-
dev->if_port = map->port;
505+
WRITE_ONCE(dev->if_port, map->port);
506506
netdev_info(dev, "switched to %s port\n", if_names[dev->if_port]);
507507
tc589_set_xcvr(dev, dev->if_port);
508508
} else {

drivers/net/ethernet/8390/etherh.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ static int etherh_set_config(struct net_device *dev, struct ifmap *map)
258258
* media type, turn off automedia detection.
259259
*/
260260
dev->flags &= ~IFF_AUTOMEDIA;
261-
dev->if_port = map->port;
261+
WRITE_ONCE(dev->if_port, map->port);
262262
break;
263263

264264
default:

drivers/net/ethernet/8390/pcnet_cs.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -994,7 +994,7 @@ static int set_config(struct net_device *dev, struct ifmap *map)
994994
return -EOPNOTSUPP;
995995
else if ((map->port < 1) || (map->port > 2))
996996
return -EINVAL;
997-
dev->if_port = map->port;
997+
WRITE_ONCE(dev->if_port, map->port);
998998
netdev_info(dev, "switched to %s port\n", if_names[dev->if_port]);
999999
NS8390_init(dev, 1);
10001000
}

drivers/net/ethernet/amd/nmclan_cs.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -760,7 +760,7 @@ static int mace_config(struct net_device *dev, struct ifmap *map)
760760
{
761761
if ((map->port != (u_char)(-1)) && (map->port != dev->if_port)) {
762762
if (map->port <= 2) {
763-
dev->if_port = map->port;
763+
WRITE_ONCE(dev->if_port, map->port);
764764
netdev_info(dev, "switched to %s port\n", if_names[dev->if_port]);
765765
} else
766766
return -EINVAL;

drivers/net/ethernet/sis/sis900.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2273,7 +2273,7 @@ static int sis900_set_config(struct net_device *dev, struct ifmap *map)
22732273
* (which seems to be different from the ifport(pcmcia) definition) */
22742274
switch(map->port){
22752275
case IF_PORT_UNKNOWN: /* use auto here */
2276-
dev->if_port = map->port;
2276+
WRITE_ONCE(dev->if_port, map->port);
22772277
/* we are going to change the media type, so the Link
22782278
* will be temporary down and we need to reflect that
22792279
* here. When the Link comes up again, it will be
@@ -2294,7 +2294,7 @@ static int sis900_set_config(struct net_device *dev, struct ifmap *map)
22942294
break;
22952295

22962296
case IF_PORT_10BASET: /* 10BaseT */
2297-
dev->if_port = map->port;
2297+
WRITE_ONCE(dev->if_port, map->port);
22982298

22992299
/* we are going to change the media type, so the Link
23002300
* will be temporary down and we need to reflect that
@@ -2315,7 +2315,7 @@ static int sis900_set_config(struct net_device *dev, struct ifmap *map)
23152315

23162316
case IF_PORT_100BASET: /* 100BaseT */
23172317
case IF_PORT_100BASETX: /* 100BaseTx */
2318-
dev->if_port = map->port;
2318+
WRITE_ONCE(dev->if_port, map->port);
23192319

23202320
/* we are going to change the media type, so the Link
23212321
* will be temporary down and we need to reflect that

drivers/net/ethernet/smsc/smc91c92_cs.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1595,7 +1595,7 @@ static int s9k_config(struct net_device *dev, struct ifmap *map)
15951595
return -EOPNOTSUPP;
15961596
else if (map->port > 2)
15971597
return -EINVAL;
1598-
dev->if_port = map->port;
1598+
WRITE_ONCE(dev->if_port, map->port);
15991599
netdev_info(dev, "switched to %s port\n", if_names[dev->if_port]);
16001600
smc_reset(dev);
16011601
}

drivers/net/ethernet/xircom/xirc2ps_cs.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1366,10 +1366,10 @@ do_config(struct net_device *dev, struct ifmap *map)
13661366
return -EINVAL;
13671367
if (!map->port) {
13681368
local->probe_port = 1;
1369-
dev->if_port = 1;
1369+
WRITE_ONCE(dev->if_port, 1);
13701370
} else {
13711371
local->probe_port = 0;
1372-
dev->if_port = map->port;
1372+
WRITE_ONCE(dev->if_port, map->port);
13731373
}
13741374
netdev_info(dev, "switching to %s port\n", if_names[dev->if_port]);
13751375
do_reset(dev,1); /* not the fine way :-) */

0 commit comments

Comments
 (0)