FAILED: patch "[PATCH] hv_netvsc: Mark VF as slave before exposing it to user-mode" failed to apply to 4.14-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 4.14-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-4.14.y
git checkout FETCH_HEAD
git cherry-pick -x c807d6cd089d2f4951baa838081ec5ae3e2360f8
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2023113056-renounce-jawed-4cae@gregkh' --subject-prefix 'PATCH 4.14.y' HEAD^..
Possible dependencies:
c807d6cd089d ("hv_netvsc: Mark VF as slave before exposing it to user-mode")365e1ececb29 ("hv_netvsc: Fix race between VF offering and VF association message from host") d0922bf79817 ("hv_netvsc: Add error handling while switching data path")34b06a2eee44 ("hv_netvsc: Process NETDEV_GOING_DOWN on VF hot remove")8b31f8c982b7 ("hv_netvsc: Wait for completion on request SWITCH_DATA_PATH")4d18fcc95f50 ("hv_netvsc: Use vmbus_requestor to generate transaction IDs for VMBus hardening") e8b7db38449a ("Drivers: hv: vmbus: Add vmbus_requestor data structure for VMBus hardening") 4907a43da831 ("Merge tag 'hyperv-next-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/hyperv/linux")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From c807d6cd089d2f4951baa838081ec5ae3e2360f8 Mon Sep 17 00:00:00 2001
From: Long Li <[email protected]>
Date: Sun, 19 Nov 2023 08:23:43 -0800
Subject: [PATCH] hv_netvsc: Mark VF as slave before exposing it to user-mode
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.
drivers/net/hyperv/netvsc_drv.c +23 -9
@@ -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 :