net: annotate data-races around dev->name_assign_type
authorEric Dumazet <edumazet@google.com>
Tue, 13 Feb 2024 06:32:33 +0000 (06:32 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 14 Feb 2024 11:20:13 +0000 (11:20 +0000)
name_assign_type_show() runs locklessly, we should annotate
accesses to dev->name_assign_type.

Alternative would be to grab devnet_rename_sem semaphore
from name_assign_type_show(), but this would not bring
more accuracy.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/dev.c
net/core/net-sysfs.c

index 2d02ca8a3da5f9b7959b5efe293a37f7d981e021..720bd68382129140c8257795e4d14503990edffe 100644 (file)
@@ -1228,13 +1228,13 @@ int dev_change_name(struct net_device *dev, const char *newname)
                            dev->flags & IFF_UP ? " (while UP)" : "");
 
        old_assign_type = dev->name_assign_type;
-       dev->name_assign_type = NET_NAME_RENAMED;
+       WRITE_ONCE(dev->name_assign_type, NET_NAME_RENAMED);
 
 rollback:
        ret = device_rename(&dev->dev, dev->name);
        if (ret) {
                memcpy(dev->name, oldname, IFNAMSIZ);
-               dev->name_assign_type = old_assign_type;
+               WRITE_ONCE(dev->name_assign_type, old_assign_type);
                up_write(&devnet_rename_sem);
                return ret;
        }
@@ -1263,7 +1263,7 @@ rollback:
                        down_write(&devnet_rename_sem);
                        memcpy(dev->name, oldname, IFNAMSIZ);
                        memcpy(oldname, newname, IFNAMSIZ);
-                       dev->name_assign_type = old_assign_type;
+                       WRITE_ONCE(dev->name_assign_type, old_assign_type);
                        old_assign_type = NET_NAME_RENAMED;
                        goto rollback;
                } else {
index a09d507c5b03d24a829bf7af0b7cf1e6a0bdb65a..f4c2b82674951bbeefd880ca22c54e6a32c9f988 100644 (file)
@@ -125,7 +125,7 @@ static DEVICE_ATTR_RO(iflink);
 
 static ssize_t format_name_assign_type(const struct net_device *dev, char *buf)
 {
-       return sysfs_emit(buf, fmt_dec, dev->name_assign_type);
+       return sysfs_emit(buf, fmt_dec, READ_ONCE(dev->name_assign_type));
 }
 
 static ssize_t name_assign_type_show(struct device *dev,
@@ -135,7 +135,7 @@ static ssize_t name_assign_type_show(struct device *dev,
        struct net_device *ndev = to_net_dev(dev);
        ssize_t ret = -EINVAL;
 
-       if (ndev->name_assign_type != NET_NAME_UNKNOWN)
+       if (READ_ONCE(ndev->name_assign_type) != NET_NAME_UNKNOWN)
                ret = netdev_show(dev, attr, buf, format_name_assign_type);
 
        return ret;