Commit 8d8b1a42 authored by Eric Dumazet's avatar Eric Dumazet Committed by Jakub Kicinski

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: default avatarEric Dumazet <edumazet@google.com>
Reviewed-by: default avatarSimon Horman <horms@kernel.org>
Link: https://lore.kernel.org/r/20240507184144.1230469-1-edumazet@google.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent e2d09e5a
...@@ -502,7 +502,7 @@ static int el3_config(struct net_device *dev, struct ifmap *map) ...@@ -502,7 +502,7 @@ static int el3_config(struct net_device *dev, struct ifmap *map)
{ {
if ((map->port != (u_char)(-1)) && (map->port != dev->if_port)) { if ((map->port != (u_char)(-1)) && (map->port != dev->if_port)) {
if (map->port <= 3) { if (map->port <= 3) {
dev->if_port = map->port; WRITE_ONCE(dev->if_port, map->port);
netdev_info(dev, "switched to %s port\n", if_names[dev->if_port]); netdev_info(dev, "switched to %s port\n", if_names[dev->if_port]);
tc589_set_xcvr(dev, dev->if_port); tc589_set_xcvr(dev, dev->if_port);
} else { } else {
......
...@@ -258,7 +258,7 @@ static int etherh_set_config(struct net_device *dev, struct ifmap *map) ...@@ -258,7 +258,7 @@ static int etherh_set_config(struct net_device *dev, struct ifmap *map)
* media type, turn off automedia detection. * media type, turn off automedia detection.
*/ */
dev->flags &= ~IFF_AUTOMEDIA; dev->flags &= ~IFF_AUTOMEDIA;
dev->if_port = map->port; WRITE_ONCE(dev->if_port, map->port);
break; break;
default: default:
......
...@@ -994,7 +994,7 @@ static int set_config(struct net_device *dev, struct ifmap *map) ...@@ -994,7 +994,7 @@ static int set_config(struct net_device *dev, struct ifmap *map)
return -EOPNOTSUPP; return -EOPNOTSUPP;
else if ((map->port < 1) || (map->port > 2)) else if ((map->port < 1) || (map->port > 2))
return -EINVAL; return -EINVAL;
dev->if_port = map->port; WRITE_ONCE(dev->if_port, map->port);
netdev_info(dev, "switched to %s port\n", if_names[dev->if_port]); netdev_info(dev, "switched to %s port\n", if_names[dev->if_port]);
NS8390_init(dev, 1); NS8390_init(dev, 1);
} }
......
...@@ -760,7 +760,7 @@ static int mace_config(struct net_device *dev, struct ifmap *map) ...@@ -760,7 +760,7 @@ static int mace_config(struct net_device *dev, struct ifmap *map)
{ {
if ((map->port != (u_char)(-1)) && (map->port != dev->if_port)) { if ((map->port != (u_char)(-1)) && (map->port != dev->if_port)) {
if (map->port <= 2) { if (map->port <= 2) {
dev->if_port = map->port; WRITE_ONCE(dev->if_port, map->port);
netdev_info(dev, "switched to %s port\n", if_names[dev->if_port]); netdev_info(dev, "switched to %s port\n", if_names[dev->if_port]);
} else } else
return -EINVAL; return -EINVAL;
......
...@@ -2273,7 +2273,7 @@ static int sis900_set_config(struct net_device *dev, struct ifmap *map) ...@@ -2273,7 +2273,7 @@ static int sis900_set_config(struct net_device *dev, struct ifmap *map)
* (which seems to be different from the ifport(pcmcia) definition) */ * (which seems to be different from the ifport(pcmcia) definition) */
switch(map->port){ switch(map->port){
case IF_PORT_UNKNOWN: /* use auto here */ case IF_PORT_UNKNOWN: /* use auto here */
dev->if_port = map->port; WRITE_ONCE(dev->if_port, map->port);
/* we are going to change the media type, so the Link /* we are going to change the media type, so the Link
* will be temporary down and we need to reflect that * will be temporary down and we need to reflect that
* here. When the Link comes up again, it will be * 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) ...@@ -2294,7 +2294,7 @@ static int sis900_set_config(struct net_device *dev, struct ifmap *map)
break; break;
case IF_PORT_10BASET: /* 10BaseT */ case IF_PORT_10BASET: /* 10BaseT */
dev->if_port = map->port; WRITE_ONCE(dev->if_port, map->port);
/* we are going to change the media type, so the Link /* we are going to change the media type, so the Link
* will be temporary down and we need to reflect that * 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) ...@@ -2315,7 +2315,7 @@ static int sis900_set_config(struct net_device *dev, struct ifmap *map)
case IF_PORT_100BASET: /* 100BaseT */ case IF_PORT_100BASET: /* 100BaseT */
case IF_PORT_100BASETX: /* 100BaseTx */ case IF_PORT_100BASETX: /* 100BaseTx */
dev->if_port = map->port; WRITE_ONCE(dev->if_port, map->port);
/* we are going to change the media type, so the Link /* we are going to change the media type, so the Link
* will be temporary down and we need to reflect that * will be temporary down and we need to reflect that
......
...@@ -1595,7 +1595,7 @@ static int s9k_config(struct net_device *dev, struct ifmap *map) ...@@ -1595,7 +1595,7 @@ static int s9k_config(struct net_device *dev, struct ifmap *map)
return -EOPNOTSUPP; return -EOPNOTSUPP;
else if (map->port > 2) else if (map->port > 2)
return -EINVAL; return -EINVAL;
dev->if_port = map->port; WRITE_ONCE(dev->if_port, map->port);
netdev_info(dev, "switched to %s port\n", if_names[dev->if_port]); netdev_info(dev, "switched to %s port\n", if_names[dev->if_port]);
smc_reset(dev); smc_reset(dev);
} }
......
...@@ -1366,10 +1366,10 @@ do_config(struct net_device *dev, struct ifmap *map) ...@@ -1366,10 +1366,10 @@ do_config(struct net_device *dev, struct ifmap *map)
return -EINVAL; return -EINVAL;
if (!map->port) { if (!map->port) {
local->probe_port = 1; local->probe_port = 1;
dev->if_port = 1; WRITE_ONCE(dev->if_port, 1);
} else { } else {
local->probe_port = 0; local->probe_port = 0;
dev->if_port = map->port; WRITE_ONCE(dev->if_port, map->port);
} }
netdev_info(dev, "switching to %s port\n", if_names[dev->if_port]); netdev_info(dev, "switching to %s port\n", if_names[dev->if_port]);
do_reset(dev,1); /* not the fine way :-) */ do_reset(dev,1); /* not the fine way :-) */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment