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