netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net,v5, 0/3] hv_netvsc: fix race of netvsc, VF register, and slave bit
@ 2023-11-19 16:23 Haiyang Zhang
  2023-11-19 16:23 ` [PATCH net,v5, 1/3] hv_netvsc: fix race of netvsc and VF register_netdevice Haiyang Zhang
                   ` (3 more replies)
  0 siblings, 4 replies; 7+ messages in thread
From: Haiyang Zhang @ 2023-11-19 16:23 UTC (permalink / raw)
  To: linux-hyperv, netdev
  Cc: haiyangz, kys, wei.liu, decui, edumazet, kuba, pabeni, stephen,
	davem, linux-kernel

There are some races between netvsc probe, set notifier, VF register,
and slave bit setting.
This patch set fixes them.

Haiyang Zhang (2):
  hv_netvsc: fix race of netvsc and VF register_netdevice
  hv_netvsc: Fix race of register_netdevice_notifier and VF register

Long Li (1):
  hv_netvsc: Mark VF as slave before exposing it to user-mode

 drivers/net/hyperv/netvsc_drv.c | 66 ++++++++++++++++++++++-----------
 1 file changed, 45 insertions(+), 21 deletions(-)

-- 
2.34.1


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

* [PATCH net,v5, 1/3] hv_netvsc: fix race of netvsc and VF register_netdevice
  2023-11-19 16:23 [PATCH net,v5, 0/3] hv_netvsc: fix race of netvsc, VF register, and slave bit Haiyang Zhang
@ 2023-11-19 16:23 ` Haiyang Zhang
  2023-11-19 16:23 ` [PATCH net,v5, 2/3] hv_netvsc: Fix race of register_netdevice_notifier and VF register Haiyang Zhang
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 7+ messages in thread
From: Haiyang Zhang @ 2023-11-19 16:23 UTC (permalink / raw)
  To: linux-hyperv, netdev
  Cc: haiyangz, kys, wei.liu, decui, edumazet, kuba, pabeni, stephen,
	davem, linux-kernel, stable

The rtnl lock also needs to be held before rndis_filter_device_add()
which advertises nvsp_2_vsc_capability / sriov bit, and triggers
VF NIC offering and registering. If VF NIC finished register_netdev()
earlier it may cause name based config failure.

To fix this issue, move the call to rtnl_lock() before
rndis_filter_device_add(), so VF will be registered later than netvsc
/ synthetic NIC, and gets a name numbered (ethX) after netvsc.

Cc: stable@vger.kernel.org
Fixes: e04e7a7bbd4b ("hv_netvsc: Fix a deadlock by getting rtnl lock earlier in netvsc_probe()")
Reported-by: Dexuan Cui <decui@microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Reviewed-by: Wojciech Drewek <wojciech.drewek@intel.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Reviewed-by: Dexuan Cui <decui@microsoft.com>
---
v3:
  Divide it into two patches, suggested by Jakub Kicinski.
v2:
  Fix rtnl_unlock() in error handling as found by Wojciech Drewek.

---
 drivers/net/hyperv/netvsc_drv.c | 25 +++++++++++++++----------
 1 file changed, 15 insertions(+), 10 deletions(-)

diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c
index 3ba3c8fb28a5..5e528a76f5f5 100644
--- a/drivers/net/hyperv/netvsc_drv.c
+++ b/drivers/net/hyperv/netvsc_drv.c
@@ -2531,15 +2531,6 @@ static int netvsc_probe(struct hv_device *dev,
 		goto devinfo_failed;
 	}
 
-	nvdev = rndis_filter_device_add(dev, device_info);
-	if (IS_ERR(nvdev)) {
-		ret = PTR_ERR(nvdev);
-		netdev_err(net, "unable to add netvsc device (ret %d)\n", ret);
-		goto rndis_failed;
-	}
-
-	eth_hw_addr_set(net, device_info->mac_adr);
-
 	/* We must get rtnl lock before scheduling nvdev->subchan_work,
 	 * otherwise netvsc_subchan_work() can get rtnl lock first and wait
 	 * all subchannels to show up, but that may not happen because
@@ -2547,9 +2538,23 @@ static int netvsc_probe(struct hv_device *dev,
 	 * -> ... -> device_add() -> ... -> __device_attach() can't get
 	 * the device lock, so all the subchannels can't be processed --
 	 * finally netvsc_subchan_work() hangs forever.
+	 *
+	 * The rtnl lock also needs to be held before rndis_filter_device_add()
+	 * which advertises nvsp_2_vsc_capability / sriov bit, and triggers
+	 * VF NIC offering and registering. If VF NIC finished register_netdev()
+	 * earlier it may cause name based config failure.
 	 */
 	rtnl_lock();
 
+	nvdev = rndis_filter_device_add(dev, device_info);
+	if (IS_ERR(nvdev)) {
+		ret = PTR_ERR(nvdev);
+		netdev_err(net, "unable to add netvsc device (ret %d)\n", ret);
+		goto rndis_failed;
+	}
+
+	eth_hw_addr_set(net, device_info->mac_adr);
+
 	if (nvdev->num_chn > 1)
 		schedule_work(&nvdev->subchan_work);
 
@@ -2586,9 +2591,9 @@ static int netvsc_probe(struct hv_device *dev,
 	return 0;
 
 register_failed:
-	rtnl_unlock();
 	rndis_filter_device_remove(dev, nvdev);
 rndis_failed:
+	rtnl_unlock();
 	netvsc_devinfo_put(device_info);
 devinfo_failed:
 	free_percpu(net_device_ctx->vf_stats);
-- 
2.34.1


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

* [PATCH net,v5, 2/3] hv_netvsc: Fix race of register_netdevice_notifier and VF register
  2023-11-19 16:23 [PATCH net,v5, 0/3] hv_netvsc: fix race of netvsc, VF register, and slave bit Haiyang Zhang
  2023-11-19 16:23 ` [PATCH net,v5, 1/3] hv_netvsc: fix race of netvsc and VF register_netdevice Haiyang Zhang
@ 2023-11-19 16:23 ` Haiyang Zhang
  2023-11-19 16:23 ` [PATCH net,v5, 3/3] hv_netvsc: Mark VF as slave before exposing it to user-mode Haiyang Zhang
  2023-11-21 12:20 ` [PATCH net,v5, 0/3] hv_netvsc: fix race of netvsc, VF register, and slave bit patchwork-bot+netdevbpf
  3 siblings, 0 replies; 7+ messages in thread
From: Haiyang Zhang @ 2023-11-19 16:23 UTC (permalink / raw)
  To: linux-hyperv, netdev
  Cc: haiyangz, kys, wei.liu, decui, edumazet, kuba, pabeni, stephen,
	davem, linux-kernel, stable

If VF NIC is registered earlier, NETDEV_REGISTER event is replayed,
but NETDEV_POST_INIT is not.

Move register_netdevice_notifier() earlier, so the call back
function is set before probing.

Cc: stable@vger.kernel.org
Fixes: e04e7a7bbd4b ("hv_netvsc: Fix a deadlock by getting rtnl lock earlier in netvsc_probe()")
Reported-by: Dexuan Cui <decui@microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Reviewed-by: Wojciech Drewek <wojciech.drewek@intel.com>
Reviewed-by: Dexuan Cui <decui@microsoft.com>

---
v5:
  Use a more idiomatic form for the error path, suggested by Simon Horman.
v3:
  Divide it into two patches, suggested by Jakub Kicinski.
v2:
  Fix rtnl_unlock() in error handling as found by Wojciech Drewek.
---
 drivers/net/hyperv/netvsc_drv.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c
index 5e528a76f5f5..b7dfd51f09e6 100644
--- a/drivers/net/hyperv/netvsc_drv.c
+++ b/drivers/net/hyperv/netvsc_drv.c
@@ -2793,12 +2793,17 @@ static int __init netvsc_drv_init(void)
 	}
 	netvsc_ring_bytes = ring_size * PAGE_SIZE;
 
+	register_netdevice_notifier(&netvsc_netdev_notifier);
+
 	ret = vmbus_driver_register(&netvsc_drv);
 	if (ret)
-		return ret;
+		goto err_vmbus_reg;
 
-	register_netdevice_notifier(&netvsc_netdev_notifier);
 	return 0;
+
+err_vmbus_reg:
+	unregister_netdevice_notifier(&netvsc_netdev_notifier);
+	return ret;
 }
 
 MODULE_LICENSE("GPL");
-- 
2.34.1


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

* [PATCH net,v5, 3/3] hv_netvsc: Mark VF as slave before exposing it to user-mode
  2023-11-19 16:23 [PATCH net,v5, 0/3] hv_netvsc: fix race of netvsc, VF register, and slave bit Haiyang Zhang
  2023-11-19 16:23 ` [PATCH net,v5, 1/3] hv_netvsc: fix race of netvsc and VF register_netdevice Haiyang Zhang
  2023-11-19 16:23 ` [PATCH net,v5, 2/3] hv_netvsc: Fix race of register_netdevice_notifier and VF register Haiyang Zhang
@ 2023-11-19 16:23 ` Haiyang Zhang
  2023-11-19 16:53   ` Stephen Hemminger
  2023-11-20 19:28   ` Dexuan Cui
  2023-11-21 12:20 ` [PATCH net,v5, 0/3] hv_netvsc: fix race of netvsc, VF register, and slave bit patchwork-bot+netdevbpf
  3 siblings, 2 replies; 7+ messages in thread
From: Haiyang Zhang @ 2023-11-19 16:23 UTC (permalink / raw)
  To: linux-hyperv, netdev
  Cc: haiyangz, kys, wei.liu, decui, edumazet, kuba, pabeni, stephen,
	davem, linux-kernel, Long Li, stable

From: Long Li <longli@microsoft.com>

When a VF is being exposed form the kernel, it should be marked as "slave"
before exposing to the user-mode. The VF is not usable without netvsc
running as master. The user-mode should never see a VF without the "slave"
flag.

This commit moves the code of setting the slave flag to the time before
VF is exposed to user-mode.

Cc: stable@vger.kernel.org
Fixes: 0c195567a8f6 ("netvsc: transparent VF management")
Signed-off-by: Long Li <longli@microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
---
v5:
Change function name netvsc_prepare_slave() to netvsc_prepare_bonding().
v4:
Add comments in get_netvsc_byslot() explaining the need to check dev_addr
v2:
Use a new function to handle NETDEV_POST_INIT.

---
 drivers/net/hyperv/netvsc_drv.c | 32 +++++++++++++++++++++++---------
 1 file changed, 23 insertions(+), 9 deletions(-)

diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c
index b7dfd51f09e6..706ea5263e87 100644
--- a/drivers/net/hyperv/netvsc_drv.c
+++ b/drivers/net/hyperv/netvsc_drv.c
@@ -2206,9 +2206,6 @@ static int netvsc_vf_join(struct net_device *vf_netdev,
 		goto upper_link_failed;
 	}
 
-	/* set slave flag before open to prevent IPv6 addrconf */
-	vf_netdev->flags |= IFF_SLAVE;
-
 	schedule_delayed_work(&ndev_ctx->vf_takeover, VF_TAKEOVER_INT);
 
 	call_netdevice_notifiers(NETDEV_JOIN, vf_netdev);
@@ -2315,16 +2312,18 @@ static struct net_device *get_netvsc_byslot(const struct net_device *vf_netdev)
 
 	}
 
-	/* Fallback path to check synthetic vf with
-	 * help of mac addr
+	/* Fallback path to check synthetic vf with help of mac addr.
+	 * Because this function can be called before vf_netdev is
+	 * initialized (NETDEV_POST_INIT) when its perm_addr has not been copied
+	 * from dev_addr, also try to match to its dev_addr.
+	 * Note: On Hyper-V and Azure, it's not possible to set a MAC address
+	 * on a VF that matches to the MAC of a unrelated NETVSC device.
 	 */
 	list_for_each_entry(ndev_ctx, &netvsc_dev_list, list) {
 		ndev = hv_get_drvdata(ndev_ctx->device_ctx);
-		if (ether_addr_equal(vf_netdev->perm_addr, ndev->perm_addr)) {
-			netdev_notice(vf_netdev,
-				      "falling back to mac addr based matching\n");
+		if (ether_addr_equal(vf_netdev->perm_addr, ndev->perm_addr) ||
+		    ether_addr_equal(vf_netdev->dev_addr, ndev->perm_addr))
 			return ndev;
-		}
 	}
 
 	netdev_notice(vf_netdev,
@@ -2332,6 +2331,19 @@ static struct net_device *get_netvsc_byslot(const struct net_device *vf_netdev)
 	return NULL;
 }
 
+static int netvsc_prepare_bonding(struct net_device *vf_netdev)
+{
+	struct net_device *ndev;
+
+	ndev = get_netvsc_byslot(vf_netdev);
+	if (!ndev)
+		return NOTIFY_DONE;
+
+	/* set slave flag before open to prevent IPv6 addrconf */
+	vf_netdev->flags |= IFF_SLAVE;
+	return NOTIFY_DONE;
+}
+
 static int netvsc_register_vf(struct net_device *vf_netdev)
 {
 	struct net_device_context *net_device_ctx;
@@ -2758,6 +2770,8 @@ static int netvsc_netdev_event(struct notifier_block *this,
 		return NOTIFY_DONE;
 
 	switch (event) {
+	case NETDEV_POST_INIT:
+		return netvsc_prepare_bonding(event_dev);
 	case NETDEV_REGISTER:
 		return netvsc_register_vf(event_dev);
 	case NETDEV_UNREGISTER:
-- 
2.34.1


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

* Re: [PATCH net,v5, 3/3] hv_netvsc: Mark VF as slave before exposing it to user-mode
  2023-11-19 16:23 ` [PATCH net,v5, 3/3] hv_netvsc: Mark VF as slave before exposing it to user-mode Haiyang Zhang
@ 2023-11-19 16:53   ` Stephen Hemminger
  2023-11-20 19:28   ` Dexuan Cui
  1 sibling, 0 replies; 7+ messages in thread
From: Stephen Hemminger @ 2023-11-19 16:53 UTC (permalink / raw)
  To: Haiyang Zhang
  Cc: linux-hyperv, netdev, kys, wei.liu, decui, edumazet, kuba, pabeni,
	davem, linux-kernel, Long Li, stable

On Sun, 19 Nov 2023 08:23:43 -0800
Haiyang Zhang <haiyangz@microsoft.com> wrote:

> From: Long Li <longli@microsoft.com>
> 
> When a VF is being exposed form the kernel, it should be marked as "slave"
> before exposing to the user-mode. The VF is not usable without netvsc
> running as master. The user-mode should never see a VF without the "slave"
> flag.
> 
> This commit moves the code of setting the slave flag to the time before
> VF is exposed to user-mode.
> 
> Cc: stable@vger.kernel.org
> Fixes: 0c195567a8f6 ("netvsc: transparent VF management")
> Signed-off-by: Long Li <longli@microsoft.com>
> Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>

Acked-by: Stephen Hemminger <stephen@networkplumber.org>



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

* RE: [PATCH net,v5, 3/3] hv_netvsc: Mark VF as slave before exposing it to user-mode
  2023-11-19 16:23 ` [PATCH net,v5, 3/3] hv_netvsc: Mark VF as slave before exposing it to user-mode Haiyang Zhang
  2023-11-19 16:53   ` Stephen Hemminger
@ 2023-11-20 19:28   ` Dexuan Cui
  1 sibling, 0 replies; 7+ messages in thread
From: Dexuan Cui @ 2023-11-20 19:28 UTC (permalink / raw)
  To: Haiyang Zhang, linux-hyperv@vger.kernel.org,
	netdev@vger.kernel.org
  Cc: KY Srinivasan, wei.liu@kernel.org, edumazet@google.com,
	kuba@kernel.org, pabeni@redhat.com, stephen, davem@davemloft.net,
	linux-kernel@vger.kernel.org, Long Li, stable@vger.kernel.org

> From: LKML haiyangz <lkmlhyz@microsoft.com> On Behalf Of Haiyang
> Zhang
> [...]
> From: Long Li <longli@microsoft.com>
> 
> When a VF is being exposed form the kernel, it should be marked as
> "slave"
> before exposing to the user-mode. The VF is not usable without netvsc
> running as master. The user-mode should never see a VF without the
> "slave"
> flag.
> 
> This commit moves the code of setting the slave flag to the time before
> VF is exposed to user-mode.
> 
> Cc: stable@vger.kernel.org
> Fixes: 0c195567a8f6 ("netvsc: transparent VF management")
> Signed-off-by: Long Li <longli@microsoft.com>
> Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
> ---
> v5:
> Change function name netvsc_prepare_slave() to
> netvsc_prepare_bonding().
> v4:
> Add comments in get_netvsc_byslot() explaining the need to check
> dev_addr
> v2:
> Use a new function to handle NETDEV_POST_INIT.

Acked-by: Dexuan Cui <decui@microsoft.com>

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

* Re: [PATCH net,v5, 0/3] hv_netvsc: fix race of netvsc, VF register, and slave bit
  2023-11-19 16:23 [PATCH net,v5, 0/3] hv_netvsc: fix race of netvsc, VF register, and slave bit Haiyang Zhang
                   ` (2 preceding siblings ...)
  2023-11-19 16:23 ` [PATCH net,v5, 3/3] hv_netvsc: Mark VF as slave before exposing it to user-mode Haiyang Zhang
@ 2023-11-21 12:20 ` patchwork-bot+netdevbpf
  3 siblings, 0 replies; 7+ messages in thread
From: patchwork-bot+netdevbpf @ 2023-11-21 12:20 UTC (permalink / raw)
  To: Haiyang Zhang
  Cc: linux-hyperv, netdev, kys, wei.liu, decui, edumazet, kuba, pabeni,
	stephen, davem, linux-kernel

Hello:

This series was applied to netdev/net.git (main)
by Paolo Abeni <pabeni@redhat.com>:

On Sun, 19 Nov 2023 08:23:40 -0800 you wrote:
> There are some races between netvsc probe, set notifier, VF register,
> and slave bit setting.
> This patch set fixes them.
> 
> Haiyang Zhang (2):
>   hv_netvsc: fix race of netvsc and VF register_netdevice
>   hv_netvsc: Fix race of register_netdevice_notifier and VF register
> 
> [...]

Here is the summary with links:
  - [net,v5,1/3] hv_netvsc: fix race of netvsc and VF register_netdevice
    https://git.kernel.org/netdev/net/c/d30fb712e529
  - [net,v5,2/3] hv_netvsc: Fix race of register_netdevice_notifier and VF register
    https://git.kernel.org/netdev/net/c/85520856466e
  - [net,v5,3/3] hv_netvsc: Mark VF as slave before exposing it to user-mode
    https://git.kernel.org/netdev/net/c/c807d6cd089d

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



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

end of thread, other threads:[~2023-11-21 12:20 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-11-19 16:23 [PATCH net,v5, 0/3] hv_netvsc: fix race of netvsc, VF register, and slave bit Haiyang Zhang
2023-11-19 16:23 ` [PATCH net,v5, 1/3] hv_netvsc: fix race of netvsc and VF register_netdevice Haiyang Zhang
2023-11-19 16:23 ` [PATCH net,v5, 2/3] hv_netvsc: Fix race of register_netdevice_notifier and VF register Haiyang Zhang
2023-11-19 16:23 ` [PATCH net,v5, 3/3] hv_netvsc: Mark VF as slave before exposing it to user-mode Haiyang Zhang
2023-11-19 16:53   ` Stephen Hemminger
2023-11-20 19:28   ` Dexuan Cui
2023-11-21 12:20 ` [PATCH net,v5, 0/3] hv_netvsc: fix race of netvsc, VF register, and slave bit patchwork-bot+netdevbpf

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).