aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJuergen Gross <jgross@suse.com>2018-09-07 08:21:30 -0400
committerDavid S. Miller <davem@davemloft.net>2018-09-08 02:03:16 -0400
commit8edfe2e992b75aee3da9316e9697c531194c2f53 (patch)
tree88181129adcf862a3aeb5f2d5d1e5b4770083fbc
parentf74dd480cf4e31e12971c58a1d832044db945670 (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.c24
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
90static DECLARE_WAIT_QUEUE_HEAD(module_load_q); 90static DECLARE_WAIT_QUEUE_HEAD(module_wq);
91static DECLARE_WAIT_QUEUE_HEAD(module_unload_q);
92 91
93struct netfront_stats { 92struct 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) ==