netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net-next 0/2] net: bring back dev_addr_sem
@ 2025-03-11  8:45 Stanislav Fomichev
  2025-03-11  8:45 ` [PATCH net-next 1/2] Revert "net: replace dev_addr_sem with netdev instance lock" Stanislav Fomichev
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Stanislav Fomichev @ 2025-03-11  8:45 UTC (permalink / raw)
  To: netdev
  Cc: davem, edumazet, kuba, pabeni, linux-kernel,
	willemdebruijn.kernel, jasowang, andrew+netdev, horms, sdf,
	jdamato, kory.maincent, atenart, kuniyu

Kohei reports an issue with dev_addr_sem conversion to netdev instance
lock in [0]. Based on the discussion, switching to netdev instance
lock to protect the address might not work for the devices that
are not using netdev ops lock.
Bring dev_addr_sem instance lock back but fix the ordering.

0: https://lore.kernel.org/netdev/20250308203835.60633-2-enjuk@amazon.com

Stanislav Fomichev (2):
  Revert "net: replace dev_addr_sem with netdev instance lock"
  net: reorder dev_addr_sem lock

 drivers/net/tap.c         |  2 +-
 drivers/net/tun.c         |  2 +-
 include/linux/netdevice.h |  4 +++-
 net/core/dev.c            | 41 +++++++++++++--------------------------
 net/core/dev.h            |  3 ++-
 net/core/dev_api.c        | 19 ++++++++++++++++--
 net/core/dev_ioctl.c      |  2 +-
 net/core/net-sysfs.c      |  7 +++++--
 net/core/rtnetlink.c      | 17 +++++++++++-----
 9 files changed, 56 insertions(+), 41 deletions(-)

-- 
2.48.1


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH net-next 1/2] Revert "net: replace dev_addr_sem with netdev instance lock"
  2025-03-11  8:45 [PATCH net-next 0/2] net: bring back dev_addr_sem Stanislav Fomichev
@ 2025-03-11  8:45 ` Stanislav Fomichev
  2025-03-12  2:11   ` Kuniyuki Iwashima
  2025-03-11  8:45 ` [PATCH net-next 2/2] net: reorder dev_addr_sem lock Stanislav Fomichev
  2025-03-12 13:25 ` [PATCH net-next 0/2] net: bring back dev_addr_sem Lei Yang
  2 siblings, 1 reply; 7+ messages in thread
From: Stanislav Fomichev @ 2025-03-11  8:45 UTC (permalink / raw)
  To: netdev
  Cc: davem, edumazet, kuba, pabeni, linux-kernel,
	willemdebruijn.kernel, jasowang, andrew+netdev, horms, sdf,
	jdamato, kory.maincent, atenart, kuniyu, Kohei Enju

This reverts commit df43d8bf10316a7c3b1e47e3cc0057a54df4a5b8.

Cc: Kohei Enju <enjuk@amazon.com>
Fixes: df43d8bf1031 ("net: replace dev_addr_sem with netdev instance lock")

Signed-off-by: Stanislav Fomichev <sdf@fomichev.me>
---
 drivers/net/tap.c         |  2 +-
 drivers/net/tun.c         |  2 +-
 include/linux/netdevice.h |  6 ++++-
 net/core/dev.c            | 52 +++++++++++++++++++--------------------
 net/core/dev.h            |  3 ++-
 net/core/dev_api.c        | 17 +++++++++++--
 net/core/dev_ioctl.c      |  2 +-
 net/core/net-sysfs.c      |  7 ++++--
 net/core/rtnetlink.c      |  6 +----
 9 files changed, 56 insertions(+), 41 deletions(-)

diff --git a/drivers/net/tap.c b/drivers/net/tap.c
index 4382f5e323b0..d4ece538f1b2 100644
--- a/drivers/net/tap.c
+++ b/drivers/net/tap.c
@@ -1017,7 +1017,7 @@ static long tap_ioctl(struct file *file, unsigned int cmd,
 			rtnl_unlock();
 			return -ENOLINK;
 		}
-		ret = dev_set_mac_address(tap->dev, &sa, NULL);
+		ret = dev_set_mac_address_user(tap->dev, &sa, NULL);
 		tap_put_tap_dev(tap);
 		rtnl_unlock();
 		return ret;
diff --git a/drivers/net/tun.c b/drivers/net/tun.c
index 55b60cb68d00..f75f912a0225 100644
--- a/drivers/net/tun.c
+++ b/drivers/net/tun.c
@@ -3193,7 +3193,7 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd,
 
 	case SIOCSIFHWADDR:
 		/* Set hw address */
-		ret = dev_set_mac_address(tun->dev, &ifr.ifr_hwaddr, NULL);
+		ret = dev_set_mac_address_user(tun->dev, &ifr.ifr_hwaddr, NULL);
 		break;
 
 	case TUNGETSNDBUF:
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 9a297757df7e..42c75cb028e7 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -2498,7 +2498,7 @@ struct net_device {
 	 *
 	 * Protects:
 	 *	@gro_flush_timeout, @napi_defer_hard_irqs, @napi_list,
-	 *	@net_shaper_hierarchy, @reg_state, @threaded, @dev_addr
+	 *	@net_shaper_hierarchy, @reg_state, @threaded
 	 *
 	 * Partially protects (writers must hold both @lock and rtnl_lock):
 	 *	@up
@@ -4198,6 +4198,10 @@ int netif_set_mac_address(struct net_device *dev, struct sockaddr *sa,
 			  struct netlink_ext_ack *extack);
 int dev_set_mac_address(struct net_device *dev, struct sockaddr *sa,
 			struct netlink_ext_ack *extack);
+int netif_set_mac_address_user(struct net_device *dev, struct sockaddr *sa,
+			       struct netlink_ext_ack *extack);
+int dev_set_mac_address_user(struct net_device *dev, struct sockaddr *sa,
+			     struct netlink_ext_ack *extack);
 int dev_get_mac_address(struct sockaddr *sa, struct net *net, char *dev_name);
 int dev_get_port_parent_id(struct net_device *dev,
 			   struct netdev_phys_item_id *ppid, bool recurse);
diff --git a/net/core/dev.c b/net/core/dev.c
index 1cb134ff7327..5a64389461e2 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -1059,28 +1059,6 @@ struct net_device *netdev_get_by_index_lock(struct net *net, int ifindex)
 	return __netdev_put_lock(dev);
 }
 
-/**
- * netdev_get_by_name_lock() - find a device by its name
- * @net: the applicable net namespace
- * @name: name of device
- *
- * Search for an interface by name. If a valid device
- * with @name is found it will be returned with netdev->lock held.
- * netdev_unlock() must be called to release it.
- *
- * Return: pointer to a device with lock held, NULL if not found.
- */
-struct net_device *netdev_get_by_name_lock(struct net *net, const char *name)
-{
-	struct net_device *dev;
-
-	dev = dev_get_by_name(net, name);
-	if (!dev)
-		return NULL;
-
-	return __netdev_put_lock(dev);
-}
-
 struct net_device *
 netdev_xa_find_lock(struct net *net, struct net_device *dev,
 		    unsigned long *index)
@@ -9612,24 +9590,44 @@ int netif_set_mac_address(struct net_device *dev, struct sockaddr *sa,
 	return 0;
 }
 
+DECLARE_RWSEM(dev_addr_sem);
+
+int netif_set_mac_address_user(struct net_device *dev, struct sockaddr *sa,
+			       struct netlink_ext_ack *extack)
+{
+	int ret;
+
+	down_write(&dev_addr_sem);
+	ret = netif_set_mac_address(dev, sa, extack);
+	up_write(&dev_addr_sem);
+	return ret;
+}
+
 int dev_get_mac_address(struct sockaddr *sa, struct net *net, char *dev_name)
 {
 	size_t size = sizeof(sa->sa_data_min);
 	struct net_device *dev;
+	int ret = 0;
 
-	dev = netdev_get_by_name_lock(net, dev_name);
-	if (!dev)
-		return -ENODEV;
+	down_read(&dev_addr_sem);
+	rcu_read_lock();
 
+	dev = dev_get_by_name_rcu(net, dev_name);
+	if (!dev) {
+		ret = -ENODEV;
+		goto unlock;
+	}
 	if (!dev->addr_len)
 		memset(sa->sa_data, 0, size);
 	else
 		memcpy(sa->sa_data, dev->dev_addr,
 		       min_t(size_t, size, dev->addr_len));
 	sa->sa_family = dev->type;
-	netdev_unlock(dev);
 
-	return 0;
+unlock:
+	rcu_read_unlock();
+	up_read(&dev_addr_sem);
+	return ret;
 }
 EXPORT_SYMBOL(dev_get_mac_address);
 
diff --git a/net/core/dev.h b/net/core/dev.h
index 0ddd3631acb0..7ee203395d8e 100644
--- a/net/core/dev.h
+++ b/net/core/dev.h
@@ -29,7 +29,6 @@ netdev_napi_by_id_lock(struct net *net, unsigned int napi_id);
 struct net_device *dev_get_by_napi_id(unsigned int napi_id);
 
 struct net_device *netdev_get_by_index_lock(struct net *net, int ifindex);
-struct net_device *netdev_get_by_name_lock(struct net *net, const char *name);
 struct net_device *__netdev_put_lock(struct net_device *dev);
 struct net_device *
 netdev_xa_find_lock(struct net *net, struct net_device *dev,
@@ -71,6 +70,8 @@ extern int		weight_p;
 extern int		dev_weight_rx_bias;
 extern int		dev_weight_tx_bias;
 
+extern struct rw_semaphore dev_addr_sem;
+
 /* rtnl helpers */
 extern struct list_head net_todo_list;
 void netdev_run_todo(void);
diff --git a/net/core/dev_api.c b/net/core/dev_api.c
index 1f0e24849bc6..2e17548af685 100644
--- a/net/core/dev_api.c
+++ b/net/core/dev_api.c
@@ -84,6 +84,19 @@ void dev_set_group(struct net_device *dev, int new_group)
 	netdev_unlock_ops(dev);
 }
 
+int dev_set_mac_address_user(struct net_device *dev, struct sockaddr *sa,
+			     struct netlink_ext_ack *extack)
+{
+	int ret;
+
+	netdev_lock_ops(dev);
+	ret = netif_set_mac_address_user(dev, sa, extack);
+	netdev_unlock_ops(dev);
+
+	return ret;
+}
+EXPORT_SYMBOL(dev_set_mac_address_user);
+
 /**
  * dev_change_net_namespace() - move device to different nethost namespace
  * @dev: device
@@ -299,9 +312,9 @@ int dev_set_mac_address(struct net_device *dev, struct sockaddr *sa,
 {
 	int ret;
 
-	netdev_lock(dev);
+	netdev_lock_ops(dev);
 	ret = netif_set_mac_address(dev, sa, extack);
-	netdev_unlock(dev);
+	netdev_unlock_ops(dev);
 
 	return ret;
 }
diff --git a/net/core/dev_ioctl.c b/net/core/dev_ioctl.c
index 5471cf4fc984..eb8b41ec5523 100644
--- a/net/core/dev_ioctl.c
+++ b/net/core/dev_ioctl.c
@@ -575,7 +575,7 @@ static int dev_ifsioc(struct net *net, struct ifreq *ifr, void __user *data,
 	case SIOCSIFHWADDR:
 		if (dev->addr_len > sizeof(struct sockaddr))
 			return -EINVAL;
-		return dev_set_mac_address(dev, &ifr->ifr_hwaddr, NULL);
+		return dev_set_mac_address_user(dev, &ifr->ifr_hwaddr, NULL);
 
 	case SIOCSIFHWBROADCAST:
 		if (ifr->ifr_hwaddr.sa_family != dev->type)
diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c
index 529a0f721268..abaa1c919b98 100644
--- a/net/core/net-sysfs.c
+++ b/net/core/net-sysfs.c
@@ -263,11 +263,14 @@ static ssize_t address_show(struct device *dev, struct device_attribute *attr,
 	struct net_device *ndev = to_net_dev(dev);
 	ssize_t ret = -EINVAL;
 
-	netdev_lock(ndev);
+	down_read(&dev_addr_sem);
+
+	rcu_read_lock();
 	if (dev_isalive(ndev))
 		ret = sysfs_format_mac(buf, ndev->dev_addr, ndev->addr_len);
-	netdev_unlock(ndev);
+	rcu_read_unlock();
 
+	up_read(&dev_addr_sem);
 	return ret;
 }
 static DEVICE_ATTR_RO(address);
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index 90597bf84e3d..9355058bf996 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -3090,11 +3090,7 @@ static int do_setlink(const struct sk_buff *skb, struct net_device *dev,
 		sa->sa_family = dev->type;
 		memcpy(sa->sa_data, nla_data(tb[IFLA_ADDRESS]),
 		       dev->addr_len);
-		if (!netdev_need_ops_lock(dev))
-			netdev_lock(dev);
-		err = netif_set_mac_address(dev, sa, extack);
-		if (!netdev_need_ops_lock(dev))
-			netdev_unlock(dev);
+		err = netif_set_mac_address_user(dev, sa, extack);
 		kfree(sa);
 		if (err)
 			goto errout;
-- 
2.48.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH net-next 2/2] net: reorder dev_addr_sem lock
  2025-03-11  8:45 [PATCH net-next 0/2] net: bring back dev_addr_sem Stanislav Fomichev
  2025-03-11  8:45 ` [PATCH net-next 1/2] Revert "net: replace dev_addr_sem with netdev instance lock" Stanislav Fomichev
@ 2025-03-11  8:45 ` Stanislav Fomichev
  2025-03-12  2:27   ` Kuniyuki Iwashima
  2025-03-12 13:25 ` [PATCH net-next 0/2] net: bring back dev_addr_sem Lei Yang
  2 siblings, 1 reply; 7+ messages in thread
From: Stanislav Fomichev @ 2025-03-11  8:45 UTC (permalink / raw)
  To: netdev
  Cc: davem, edumazet, kuba, pabeni, linux-kernel,
	willemdebruijn.kernel, jasowang, andrew+netdev, horms, sdf,
	jdamato, kory.maincent, atenart, kuniyu, Kohei Enju

Lockdep complains about circular lock in 1 -> 2 -> 3 (see below).

Change the lock ordering to be:
- rtnl_lock
- dev_addr_sem
- netdev_ops (only for lower devices!)
- team_lock (or other per-upper device lock)

1. rtnl_lock -> netdev_ops -> dev_addr_sem

rtnl_setlink
  rtnl_lock
    do_setlink IFLA_ADDRESS on lower
      netdev_ops
        dev_addr_sem

2. rtnl_lock -> team_lock -> netdev_ops

rtnl_newlink
  rtnl_lock
    do_setlink IFLA_MASTER on lower
      do_set_master
        team_add_slave
          team_lock
            team_port_add
	      dev_set_mtu
	        netdev_ops

3. rtnl_lock -> dev_addr_sem -> team_lock

rtnl_newlink
  rtnl_lock
    do_setlink IFLA_ADDRESS on upper
      dev_addr_sem
        netif_set_mac_address
          team_set_mac_address
            team_lock

4. rtnl_lock -> netdev_ops -> dev_addr_sem

rtnl_lock
  dev_ifsioc
    dev_set_mac_address_user

__tun_chr_ioctl
  rtnl_lock
    dev_set_mac_address_user

tap_ioctl
  rtnl_lock
    dev_set_mac_address_user

dev_set_mac_address_user
  netdev_lock_ops
    netif_set_mac_address_user
      dev_addr_sem

Cc: Kohei Enju <enjuk@amazon.com>
Fixes: df43d8bf1031 ("net: replace dev_addr_sem with netdev instance lock")
Signed-off-by: Stanislav Fomichev <sdf@fomichev.me>
---
 include/linux/netdevice.h |  2 --
 net/core/dev.c            | 11 -----------
 net/core/dev_api.c        |  4 +++-
 net/core/rtnetlink.c      | 15 +++++++++++++--
 4 files changed, 16 insertions(+), 16 deletions(-)

diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 42c75cb028e7..2bf1f914f61a 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -4198,8 +4198,6 @@ int netif_set_mac_address(struct net_device *dev, struct sockaddr *sa,
 			  struct netlink_ext_ack *extack);
 int dev_set_mac_address(struct net_device *dev, struct sockaddr *sa,
 			struct netlink_ext_ack *extack);
-int netif_set_mac_address_user(struct net_device *dev, struct sockaddr *sa,
-			       struct netlink_ext_ack *extack);
 int dev_set_mac_address_user(struct net_device *dev, struct sockaddr *sa,
 			     struct netlink_ext_ack *extack);
 int dev_get_mac_address(struct sockaddr *sa, struct net *net, char *dev_name);
diff --git a/net/core/dev.c b/net/core/dev.c
index 5a64389461e2..66290c159ad8 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -9592,17 +9592,6 @@ int netif_set_mac_address(struct net_device *dev, struct sockaddr *sa,
 
 DECLARE_RWSEM(dev_addr_sem);
 
-int netif_set_mac_address_user(struct net_device *dev, struct sockaddr *sa,
-			       struct netlink_ext_ack *extack)
-{
-	int ret;
-
-	down_write(&dev_addr_sem);
-	ret = netif_set_mac_address(dev, sa, extack);
-	up_write(&dev_addr_sem);
-	return ret;
-}
-
 int dev_get_mac_address(struct sockaddr *sa, struct net *net, char *dev_name)
 {
 	size_t size = sizeof(sa->sa_data_min);
diff --git a/net/core/dev_api.c b/net/core/dev_api.c
index 2e17548af685..8dbc60612100 100644
--- a/net/core/dev_api.c
+++ b/net/core/dev_api.c
@@ -89,9 +89,11 @@ int dev_set_mac_address_user(struct net_device *dev, struct sockaddr *sa,
 {
 	int ret;
 
+	down_write(&dev_addr_sem);
 	netdev_lock_ops(dev);
-	ret = netif_set_mac_address_user(dev, sa, extack);
+	ret = netif_set_mac_address(dev, sa, extack);
 	netdev_unlock_ops(dev);
+	up_write(&dev_addr_sem);
 
 	return ret;
 }
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index 9355058bf996..c9d44dad203d 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -3080,21 +3080,32 @@ static int do_setlink(const struct sk_buff *skb, struct net_device *dev,
 		struct sockaddr *sa;
 		int len;
 
+		netdev_unlock_ops(dev);
+
+		/* dev_addr_sem is an outer lock, enforce proper ordering */
+		down_write(&dev_addr_sem);
+		netdev_lock_ops(dev);
+
 		len = sizeof(sa_family_t) + max_t(size_t, dev->addr_len,
 						  sizeof(*sa));
 		sa = kmalloc(len, GFP_KERNEL);
 		if (!sa) {
+			up_write(&dev_addr_sem);
 			err = -ENOMEM;
 			goto errout;
 		}
 		sa->sa_family = dev->type;
 		memcpy(sa->sa_data, nla_data(tb[IFLA_ADDRESS]),
 		       dev->addr_len);
-		err = netif_set_mac_address_user(dev, sa, extack);
+		err = netif_set_mac_address(dev, sa, extack);
 		kfree(sa);
-		if (err)
+		if (err) {
+			up_write(&dev_addr_sem);
 			goto errout;
+		}
 		status |= DO_SETLINK_MODIFIED;
+
+		up_write(&dev_addr_sem);
 	}
 
 	if (tb[IFLA_MTU]) {
-- 
2.48.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH net-next 1/2] Revert "net: replace dev_addr_sem with netdev instance lock"
  2025-03-11  8:45 ` [PATCH net-next 1/2] Revert "net: replace dev_addr_sem with netdev instance lock" Stanislav Fomichev
@ 2025-03-12  2:11   ` Kuniyuki Iwashima
  0 siblings, 0 replies; 7+ messages in thread
From: Kuniyuki Iwashima @ 2025-03-12  2:11 UTC (permalink / raw)
  To: sdf
  Cc: andrew+netdev, atenart, davem, edumazet, enjuk, horms, jasowang,
	jdamato, kory.maincent, kuba, kuniyu, linux-kernel, netdev,
	pabeni, willemdebruijn.kernel

From: Stanislav Fomichev <sdf@fomichev.me>
Date: Tue, 11 Mar 2025 01:45:06 -0700
> This reverts commit df43d8bf10316a7c3b1e47e3cc0057a54df4a5b8.
> 
> Cc: Kohei Enju <enjuk@amazon.com>
> Fixes: df43d8bf1031 ("net: replace dev_addr_sem with netdev instance lock")
>

nit: no newline :)

> Signed-off-by: Stanislav Fomichev <sdf@fomichev.me>

Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH net-next 2/2] net: reorder dev_addr_sem lock
  2025-03-11  8:45 ` [PATCH net-next 2/2] net: reorder dev_addr_sem lock Stanislav Fomichev
@ 2025-03-12  2:27   ` Kuniyuki Iwashima
  2025-03-12  8:59     ` Stanislav Fomichev
  0 siblings, 1 reply; 7+ messages in thread
From: Kuniyuki Iwashima @ 2025-03-12  2:27 UTC (permalink / raw)
  To: sdf
  Cc: andrew+netdev, atenart, davem, edumazet, enjuk, horms, jasowang,
	jdamato, kory.maincent, kuba, kuniyu, linux-kernel, netdev,
	pabeni, willemdebruijn.kernel

From: Stanislav Fomichev <sdf@fomichev.me>
Date: Tue, 11 Mar 2025 01:45:07 -0700
> diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
> index 9355058bf996..c9d44dad203d 100644
> --- a/net/core/rtnetlink.c
> +++ b/net/core/rtnetlink.c
> @@ -3080,21 +3080,32 @@ static int do_setlink(const struct sk_buff *skb, struct net_device *dev,
>  		struct sockaddr *sa;
>  		int len;
>  
> +		netdev_unlock_ops(dev);
> +
> +		/* dev_addr_sem is an outer lock, enforce proper ordering */
> +		down_write(&dev_addr_sem);
> +		netdev_lock_ops(dev);
> +
>  		len = sizeof(sa_family_t) + max_t(size_t, dev->addr_len,
>  						  sizeof(*sa));
>  		sa = kmalloc(len, GFP_KERNEL);
>  		if (!sa) {
> +			up_write(&dev_addr_sem);
>  			err = -ENOMEM;
>  			goto errout;
>  		}
>  		sa->sa_family = dev->type;
>  		memcpy(sa->sa_data, nla_data(tb[IFLA_ADDRESS]),
>  		       dev->addr_len);

Can we move down_write() and netdev_lock_ops() here ?


> -		err = netif_set_mac_address_user(dev, sa, extack);
> +		err = netif_set_mac_address(dev, sa, extack);
>  		kfree(sa);
> -		if (err)
> +		if (err) {
> +			up_write(&dev_addr_sem);
>  			goto errout;
> +		}
>  		status |= DO_SETLINK_MODIFIED;
> +
> +		up_write(&dev_addr_sem);
>  	}
>  
>  	if (tb[IFLA_MTU]) {
> -- 
> 2.48.1

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH net-next 2/2] net: reorder dev_addr_sem lock
  2025-03-12  2:27   ` Kuniyuki Iwashima
@ 2025-03-12  8:59     ` Stanislav Fomichev
  0 siblings, 0 replies; 7+ messages in thread
From: Stanislav Fomichev @ 2025-03-12  8:59 UTC (permalink / raw)
  To: Kuniyuki Iwashima
  Cc: sdf, andrew+netdev, atenart, davem, edumazet, enjuk, horms,
	jasowang, jdamato, kory.maincent, kuba, linux-kernel, netdev,
	pabeni, willemdebruijn.kernel

On 03/11, Kuniyuki Iwashima wrote:
> From: Stanislav Fomichev <sdf@fomichev.me>
> Date: Tue, 11 Mar 2025 01:45:07 -0700
> > diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
> > index 9355058bf996..c9d44dad203d 100644
> > --- a/net/core/rtnetlink.c
> > +++ b/net/core/rtnetlink.c
> > @@ -3080,21 +3080,32 @@ static int do_setlink(const struct sk_buff *skb, struct net_device *dev,
> >  		struct sockaddr *sa;
> >  		int len;
> >  
> > +		netdev_unlock_ops(dev);
> > +
> > +		/* dev_addr_sem is an outer lock, enforce proper ordering */
> > +		down_write(&dev_addr_sem);
> > +		netdev_lock_ops(dev);
> > +
> >  		len = sizeof(sa_family_t) + max_t(size_t, dev->addr_len,
> >  						  sizeof(*sa));
> >  		sa = kmalloc(len, GFP_KERNEL);
> >  		if (!sa) {
> > +			up_write(&dev_addr_sem);
> >  			err = -ENOMEM;
> >  			goto errout;
> >  		}
> >  		sa->sa_family = dev->type;
> >  		memcpy(sa->sa_data, nla_data(tb[IFLA_ADDRESS]),
> >  		       dev->addr_len);
> 
> Can we move down_write() and netdev_lock_ops() here ?

Should be doable, yes, will also remove that up_write from the !sa
error condition. Will do, thanks for the review!

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH net-next 0/2] net: bring back dev_addr_sem
  2025-03-11  8:45 [PATCH net-next 0/2] net: bring back dev_addr_sem Stanislav Fomichev
  2025-03-11  8:45 ` [PATCH net-next 1/2] Revert "net: replace dev_addr_sem with netdev instance lock" Stanislav Fomichev
  2025-03-11  8:45 ` [PATCH net-next 2/2] net: reorder dev_addr_sem lock Stanislav Fomichev
@ 2025-03-12 13:25 ` Lei Yang
  2 siblings, 0 replies; 7+ messages in thread
From: Lei Yang @ 2025-03-12 13:25 UTC (permalink / raw)
  To: Stanislav Fomichev
  Cc: netdev, davem, edumazet, kuba, pabeni, linux-kernel,
	willemdebruijn.kernel, jasowang, andrew+netdev, horms, jdamato,
	kory.maincent, atenart, kuniyu

QE tested this patch with virtio-net regression tests, everything works fine.

Tested-by: Lei Yang <leiyang@redhat.com>

On Tue, Mar 11, 2025 at 4:45 PM Stanislav Fomichev <sdf@fomichev.me> wrote:
>
> Kohei reports an issue with dev_addr_sem conversion to netdev instance
> lock in [0]. Based on the discussion, switching to netdev instance
> lock to protect the address might not work for the devices that
> are not using netdev ops lock.
> Bring dev_addr_sem instance lock back but fix the ordering.
>
> 0: https://lore.kernel.org/netdev/20250308203835.60633-2-enjuk@amazon.com
>
> Stanislav Fomichev (2):
>   Revert "net: replace dev_addr_sem with netdev instance lock"
>   net: reorder dev_addr_sem lock
>
>  drivers/net/tap.c         |  2 +-
>  drivers/net/tun.c         |  2 +-
>  include/linux/netdevice.h |  4 +++-
>  net/core/dev.c            | 41 +++++++++++++--------------------------
>  net/core/dev.h            |  3 ++-
>  net/core/dev_api.c        | 19 ++++++++++++++++--
>  net/core/dev_ioctl.c      |  2 +-
>  net/core/net-sysfs.c      |  7 +++++--
>  net/core/rtnetlink.c      | 17 +++++++++++-----
>  9 files changed, 56 insertions(+), 41 deletions(-)
>
> --
> 2.48.1
>
>


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2025-03-12 13:26 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-03-11  8:45 [PATCH net-next 0/2] net: bring back dev_addr_sem Stanislav Fomichev
2025-03-11  8:45 ` [PATCH net-next 1/2] Revert "net: replace dev_addr_sem with netdev instance lock" Stanislav Fomichev
2025-03-12  2:11   ` Kuniyuki Iwashima
2025-03-11  8:45 ` [PATCH net-next 2/2] net: reorder dev_addr_sem lock Stanislav Fomichev
2025-03-12  2:27   ` Kuniyuki Iwashima
2025-03-12  8:59     ` Stanislav Fomichev
2025-03-12 13:25 ` [PATCH net-next 0/2] net: bring back dev_addr_sem Lei Yang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).