From: Greg Kroah-Hartman Date: Fri, 20 Apr 2018 06:46:24 +0000 (+0200) Subject: 4.9-stable patches X-Git-Tag: v3.18.106~69 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=eac4c3ce76a1e8aed8ba5f8d5c7e49f0d7442106;p=thirdparty%2Fkernel%2Fstable-queue.git 4.9-stable patches added patches: xen-netfront-fix-hang-on-device-removal.patch --- diff --git a/queue-4.9/series b/queue-4.9/series index 8833927ce32..6a6b86465ac 100644 --- a/queue-4.9/series +++ b/queue-4.9/series @@ -13,3 +13,4 @@ arm-dts-at91-at91sam9g25-fix-mux-mask-pinctrl-property.patch arm-dts-exynos-fix-iommu-support-for-gscaler-devices-on-exynos5250.patch arm-dts-at91-sama5d4-fix-pinctrl-compatible-string.patch spi-fix-scatterlist-elements-size-in-spi_map_buf.patch +xen-netfront-fix-hang-on-device-removal.patch diff --git a/queue-4.9/xen-netfront-fix-hang-on-device-removal.patch b/queue-4.9/xen-netfront-fix-hang-on-device-removal.patch new file mode 100644 index 00000000000..63c24e19ba7 --- /dev/null +++ b/queue-4.9/xen-netfront-fix-hang-on-device-removal.patch @@ -0,0 +1,54 @@ +From c2d2e6738a209f0f9dffa2dc8e7292fc45360d61 Mon Sep 17 00:00:00 2001 +From: Jason Andryuk +Date: Wed, 28 Feb 2018 07:23:23 -0500 +Subject: xen-netfront: Fix hang on device removal + +From: Jason Andryuk + +commit c2d2e6738a209f0f9dffa2dc8e7292fc45360d61 upstream. + +A toolstack may delete the vif frontend and backend xenstore entries +while xen-netfront is in the removal code path. In that case, the +checks for xenbus_read_driver_state would return XenbusStateUnknown, and +xennet_remove would hang indefinitely. This hang prevents system +shutdown. + +xennet_remove must be able to handle XenbusStateUnknown, and +netback_changed must also wake up the wake_queue for that state as well. + +Fixes: 5b5971df3bc2 ("xen-netfront: remove warning when unloading module") + +Signed-off-by: Jason Andryuk +Cc: Eduardo Otubo +Reviewed-by: Boris Ostrovsky +Signed-off-by: Juergen Gross +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/xen-netfront.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +--- a/drivers/net/xen-netfront.c ++++ b/drivers/net/xen-netfront.c +@@ -2038,7 +2038,10 @@ static void netback_changed(struct xenbu + case XenbusStateInitialised: + case XenbusStateReconfiguring: + case XenbusStateReconfigured: ++ break; ++ + case XenbusStateUnknown: ++ wake_up_all(&module_unload_q); + break; + + case XenbusStateInitWait: +@@ -2169,7 +2172,9 @@ static int xennet_remove(struct xenbus_d + xenbus_switch_state(dev, XenbusStateClosing); + wait_event(module_unload_q, + xenbus_read_driver_state(dev->otherend) == +- XenbusStateClosing); ++ XenbusStateClosing || ++ xenbus_read_driver_state(dev->otherend) == ++ XenbusStateUnknown); + + xenbus_switch_state(dev, XenbusStateClosed); + wait_event(module_unload_q,