diff options
author | Juergen Gross <jgross@suse.com> | 2018-09-07 08:21:30 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-09-08 02:03:16 -0400 |
commit | 8edfe2e992b75aee3da9316e9697c531194c2f53 (patch) | |
tree | 88181129adcf862a3aeb5f2d5d1e5b4770083fbc | |
parent | f74dd480cf4e31e12971c58a1d832044db945670 (diff) |
xen/netfront: fix waiting for xenbus state change
Commit 822fb18a82aba ("xen-netfront: wait xenbus state change when load
module manually") added a new wait queue to wait on for a state change
when the module is loaded manually. Unfortunately there is no wakeup
anywhere to stop that waiting.
Instead of introducing a new wait queue rename the existing
module_unload_q to module_wq and use it for both purposes (loading and
unloading).
As any state change of the backend might be intended to stop waiting
do the wake_up_all() in any case when netback_changed() is called.
Fixes: 822fb18a82aba ("xen-netfront: wait xenbus state change when load module manually")
Cc: <stable@vger.kernel.org> #4.18
Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/xen-netfront.c | 24 |
1 files changed, 10 insertions, 14 deletions
diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c index 73f596a90c69..9407acbd19a9 100644 --- a/drivers/net/xen-netfront.c +++ b/drivers/net/xen-netfront.c | |||
@@ -87,8 +87,7 @@ struct netfront_cb { | |||
87 | /* IRQ name is queue name with "-tx" or "-rx" appended */ | 87 | /* IRQ name is queue name with "-tx" or "-rx" appended */ |
88 | #define IRQ_NAME_SIZE (QUEUE_NAME_SIZE + 3) | 88 | #define IRQ_NAME_SIZE (QUEUE_NAME_SIZE + 3) |
89 | 89 | ||
90 | static DECLARE_WAIT_QUEUE_HEAD(module_load_q); | 90 | static DECLARE_WAIT_QUEUE_HEAD(module_wq); |
91 | static DECLARE_WAIT_QUEUE_HEAD(module_unload_q); | ||
92 | 91 | ||
93 | struct netfront_stats { | 92 | struct netfront_stats { |
94 | u64 packets; | 93 | u64 packets; |
@@ -1332,11 +1331,11 @@ static struct net_device *xennet_create_dev(struct xenbus_device *dev) | |||
1332 | netif_carrier_off(netdev); | 1331 | netif_carrier_off(netdev); |
1333 | 1332 | ||
1334 | xenbus_switch_state(dev, XenbusStateInitialising); | 1333 | xenbus_switch_state(dev, XenbusStateInitialising); |
1335 | wait_event(module_load_q, | 1334 | wait_event(module_wq, |
1336 | xenbus_read_driver_state(dev->otherend) != | 1335 | xenbus_read_driver_state(dev->otherend) != |
1337 | XenbusStateClosed && | 1336 | XenbusStateClosed && |
1338 | xenbus_read_driver_state(dev->otherend) != | 1337 | xenbus_read_driver_state(dev->otherend) != |
1339 | XenbusStateUnknown); | 1338 | XenbusStateUnknown); |
1340 | return netdev; | 1339 | return netdev; |
1341 | 1340 | ||
1342 | exit: | 1341 | exit: |
@@ -2010,15 +2009,14 @@ static void netback_changed(struct xenbus_device *dev, | |||
2010 | 2009 | ||
2011 | dev_dbg(&dev->dev, "%s\n", xenbus_strstate(backend_state)); | 2010 | dev_dbg(&dev->dev, "%s\n", xenbus_strstate(backend_state)); |
2012 | 2011 | ||
2012 | wake_up_all(&module_wq); | ||
2013 | |||
2013 | switch (backend_state) { | 2014 | switch (backend_state) { |
2014 | case XenbusStateInitialising: | 2015 | case XenbusStateInitialising: |
2015 | case XenbusStateInitialised: | 2016 | case XenbusStateInitialised: |
2016 | case XenbusStateReconfiguring: | 2017 | case XenbusStateReconfiguring: |
2017 | case XenbusStateReconfigured: | 2018 | case XenbusStateReconfigured: |
2018 | break; | ||
2019 | |||
2020 | case XenbusStateUnknown: | 2019 | case XenbusStateUnknown: |
2021 | wake_up_all(&module_unload_q); | ||
2022 | break; | 2020 | break; |
2023 | 2021 | ||
2024 | case XenbusStateInitWait: | 2022 | case XenbusStateInitWait: |
@@ -2034,12 +2032,10 @@ static void netback_changed(struct xenbus_device *dev, | |||
2034 | break; | 2032 | break; |
2035 | 2033 | ||
2036 | case XenbusStateClosed: | 2034 | case XenbusStateClosed: |
2037 | wake_up_all(&module_unload_q); | ||
2038 | if (dev->state == XenbusStateClosed) | 2035 | if (dev->state == XenbusStateClosed) |
2039 | break; | 2036 | break; |
2040 | /* Missed the backend's CLOSING state -- fallthrough */ | 2037 | /* Missed the backend's CLOSING state -- fallthrough */ |
2041 | case XenbusStateClosing: | 2038 | case XenbusStateClosing: |
2042 | wake_up_all(&module_unload_q); | ||
2043 | xenbus_frontend_closed(dev); | 2039 | xenbus_frontend_closed(dev); |
2044 | break; | 2040 | break; |
2045 | } | 2041 | } |
@@ -2147,14 +2143,14 @@ static int xennet_remove(struct xenbus_device *dev) | |||
2147 | 2143 | ||
2148 | if (xenbus_read_driver_state(dev->otherend) != XenbusStateClosed) { | 2144 | if (xenbus_read_driver_state(dev->otherend) != XenbusStateClosed) { |
2149 | xenbus_switch_state(dev, XenbusStateClosing); | 2145 | xenbus_switch_state(dev, XenbusStateClosing); |
2150 | wait_event(module_unload_q, | 2146 | wait_event(module_wq, |
2151 | xenbus_read_driver_state(dev->otherend) == | 2147 | xenbus_read_driver_state(dev->otherend) == |
2152 | XenbusStateClosing || | 2148 | XenbusStateClosing || |
2153 | xenbus_read_driver_state(dev->otherend) == | 2149 | xenbus_read_driver_state(dev->otherend) == |
2154 | XenbusStateUnknown); | 2150 | XenbusStateUnknown); |
2155 | 2151 | ||
2156 | xenbus_switch_state(dev, XenbusStateClosed); | 2152 | xenbus_switch_state(dev, XenbusStateClosed); |
2157 | wait_event(module_unload_q, | 2153 | wait_event(module_wq, |
2158 | xenbus_read_driver_state(dev->otherend) == | 2154 | xenbus_read_driver_state(dev->otherend) == |
2159 | XenbusStateClosed || | 2155 | XenbusStateClosed || |
2160 | xenbus_read_driver_state(dev->otherend) == | 2156 | xenbus_read_driver_state(dev->otherend) == |