2023-11-19 16:24:48

by Haiyang Zhang

[permalink] [raw]
Subject: [PATCH net,v5, 0/3] hv_netvsc: fix race of netvsc, VF register, and slave bit

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


2023-11-19 16:25:03

by Haiyang Zhang

[permalink] [raw]
Subject: [PATCH net,v5, 3/3] hv_netvsc: Mark VF as slave before exposing it to user-mode

From: Long Li <[email protected]>

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: [email protected]
Fixes: 0c195567a8f6 ("netvsc: transparent VF management")
Signed-off-by: Long Li <[email protected]>
Signed-off-by: Haiyang Zhang <[email protected]>
---
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

2023-11-19 16:54:46

by Stephen Hemminger

[permalink] [raw]
Subject: Re: [PATCH net,v5, 3/3] hv_netvsc: Mark VF as slave before exposing it to user-mode

On Sun, 19 Nov 2023 08:23:43 -0800
Haiyang Zhang <[email protected]> wrote:

> From: Long Li <[email protected]>
>
> 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: [email protected]
> Fixes: 0c195567a8f6 ("netvsc: transparent VF management")
> Signed-off-by: Long Li <[email protected]>
> Signed-off-by: Haiyang Zhang <[email protected]>

Acked-by: Stephen Hemminger <[email protected]>


2023-11-20 19:30:15

by Dexuan Cui

[permalink] [raw]
Subject: RE: [PATCH net,v5, 3/3] hv_netvsc: Mark VF as slave before exposing it to user-mode

> From: LKML haiyangz <[email protected]> On Behalf Of Haiyang
> Zhang
> [...]
> From: Long Li <[email protected]>
>
> 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: [email protected]
> Fixes: 0c195567a8f6 ("netvsc: transparent VF management")
> Signed-off-by: Long Li <[email protected]>
> Signed-off-by: Haiyang Zhang <[email protected]>
> ---
> 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 <[email protected]>

2023-11-21 12:21:33

by patchwork-bot+netdevbpf

[permalink] [raw]
Subject: Re: [PATCH net,v5, 0/3] hv_netvsc: fix race of netvsc, VF register, and slave bit

Hello:

This series was applied to netdev/net.git (main)
by Paolo Abeni <[email protected]>:

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