FAILED: patch "[PATCH] hv_netvsc: fix race of netvsc and VF register_netdevice" failed to apply to 4.19-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 4.19-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.19.y
git checkout FETCH_HEAD
git cherry-pick -x d30fb712e52964f2cf9a9c14cf67078394044837
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2023113020-shifter-qualifier-2df2@gregkh' --subject-prefix 'PATCH 4.19.y' HEAD^..
Possible dependencies:
d30fb712e529 ("hv_netvsc: fix race of netvsc and VF register_netdevice") 351e1581395f ("hv_netvsc: Add XDP support")0efeea5fb153 ("hv_netvsc: Add the support of hibernation") 719b85c336ed ("hv_netvsc: Fix error handling in netvsc_attach()") 68622d071e55 ("hv_netvsc: Sync offloading features to VF NIC") bf48648d650d ("hv_netvsc: Fix IP header checksum for coalesced packets") 52d3b4949192 ("hv_netvsc: fix typos in code comments") 17d912568984 ("hv_netvsc: Fix hash key value reset after other ops") 7c9f335a3ff2 ("hv_netvsc: Refactor assignments of struct netvsc_device_info") 2a7f8c3b1d3f ("hv_netvsc: remove ndo_poll_controller")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From d30fb712e52964f2cf9a9c14cf67078394044837 Mon Sep 17 00:00:00 2001
From: Haiyang Zhang <[email protected]>
Date: Sun, 19 Nov 2023 08:23:41 -0800
Subject: [PATCH] hv_netvsc: fix race of netvsc and VF register_netdevice
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.
drivers/net/hyperv/netvsc_drv.c +15 -10
@@ -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);