Skip to content

Commit 8edfe2e

Browse files
jgross1davem330
authored andcommitted
xen/netfront: fix waiting for xenbus state change
Commit 822fb18 ("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: 822fb18 ("xen-netfront: wait xenbus state change when load module manually") Cc: <[email protected]> #4.18 Signed-off-by: Juergen Gross <[email protected]> Reviewed-by: Boris Ostrovsky <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent f74dd48 commit 8edfe2e

File tree

1 file changed

+10
-14
lines changed

1 file changed

+10
-14
lines changed

drivers/net/xen-netfront.c

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,7 @@ struct netfront_cb {
8787
/* IRQ name is queue name with "-tx" or "-rx" appended */
8888
#define IRQ_NAME_SIZE (QUEUE_NAME_SIZE + 3)
8989

90-
static DECLARE_WAIT_QUEUE_HEAD(module_load_q);
91-
static DECLARE_WAIT_QUEUE_HEAD(module_unload_q);
90+
static DECLARE_WAIT_QUEUE_HEAD(module_wq);
9291

9392
struct netfront_stats {
9493
u64 packets;
@@ -1332,11 +1331,11 @@ static struct net_device *xennet_create_dev(struct xenbus_device *dev)
13321331
netif_carrier_off(netdev);
13331332

13341333
xenbus_switch_state(dev, XenbusStateInitialising);
1335-
wait_event(module_load_q,
1336-
xenbus_read_driver_state(dev->otherend) !=
1337-
XenbusStateClosed &&
1338-
xenbus_read_driver_state(dev->otherend) !=
1339-
XenbusStateUnknown);
1334+
wait_event(module_wq,
1335+
xenbus_read_driver_state(dev->otherend) !=
1336+
XenbusStateClosed &&
1337+
xenbus_read_driver_state(dev->otherend) !=
1338+
XenbusStateUnknown);
13401339
return netdev;
13411340

13421341
exit:
@@ -2010,15 +2009,14 @@ static void netback_changed(struct xenbus_device *dev,
20102009

20112010
dev_dbg(&dev->dev, "%s\n", xenbus_strstate(backend_state));
20122011

2012+
wake_up_all(&module_wq);
2013+
20132014
switch (backend_state) {
20142015
case XenbusStateInitialising:
20152016
case XenbusStateInitialised:
20162017
case XenbusStateReconfiguring:
20172018
case XenbusStateReconfigured:
2018-
break;
2019-
20202019
case XenbusStateUnknown:
2021-
wake_up_all(&module_unload_q);
20222020
break;
20232021

20242022
case XenbusStateInitWait:
@@ -2034,12 +2032,10 @@ static void netback_changed(struct xenbus_device *dev,
20342032
break;
20352033

20362034
case XenbusStateClosed:
2037-
wake_up_all(&module_unload_q);
20382035
if (dev->state == XenbusStateClosed)
20392036
break;
20402037
/* Missed the backend's CLOSING state -- fallthrough */
20412038
case XenbusStateClosing:
2042-
wake_up_all(&module_unload_q);
20432039
xenbus_frontend_closed(dev);
20442040
break;
20452041
}
@@ -2147,14 +2143,14 @@ static int xennet_remove(struct xenbus_device *dev)
21472143

21482144
if (xenbus_read_driver_state(dev->otherend) != XenbusStateClosed) {
21492145
xenbus_switch_state(dev, XenbusStateClosing);
2150-
wait_event(module_unload_q,
2146+
wait_event(module_wq,
21512147
xenbus_read_driver_state(dev->otherend) ==
21522148
XenbusStateClosing ||
21532149
xenbus_read_driver_state(dev->otherend) ==
21542150
XenbusStateUnknown);
21552151

21562152
xenbus_switch_state(dev, XenbusStateClosed);
2157-
wait_event(module_unload_q,
2153+
wait_event(module_wq,
21582154
xenbus_read_driver_state(dev->otherend) ==
21592155
XenbusStateClosed ||
21602156
xenbus_read_driver_state(dev->otherend) ==

0 commit comments

Comments
 (0)