Skip to content

Commit 33e4afb

Browse files
jgross1gregkh
authored andcommitted
xen/netfront: fix waiting for xenbus state change
commit 8edfe2e upstream. 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]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 1e5b387 commit 33e4afb

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;
@@ -1331,11 +1330,11 @@ static struct net_device *xennet_create_dev(struct xenbus_device *dev)
13311330
netif_carrier_off(netdev);
13321331

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

13411340
exit:
@@ -2009,15 +2008,14 @@ static void netback_changed(struct xenbus_device *dev,
20092008

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

2011+
wake_up_all(&module_wq);
2012+
20122013
switch (backend_state) {
20132014
case XenbusStateInitialising:
20142015
case XenbusStateInitialised:
20152016
case XenbusStateReconfiguring:
20162017
case XenbusStateReconfigured:
2017-
break;
2018-
20192018
case XenbusStateUnknown:
2020-
wake_up_all(&module_unload_q);
20212019
break;
20222020

20232021
case XenbusStateInitWait:
@@ -2033,12 +2031,10 @@ static void netback_changed(struct xenbus_device *dev,
20332031
break;
20342032

20352033
case XenbusStateClosed:
2036-
wake_up_all(&module_unload_q);
20372034
if (dev->state == XenbusStateClosed)
20382035
break;
20392036
/* Missed the backend's CLOSING state -- fallthrough */
20402037
case XenbusStateClosing:
2041-
wake_up_all(&module_unload_q);
20422038
xenbus_frontend_closed(dev);
20432039
break;
20442040
}
@@ -2146,14 +2142,14 @@ static int xennet_remove(struct xenbus_device *dev)
21462142

21472143
if (xenbus_read_driver_state(dev->otherend) != XenbusStateClosed) {
21482144
xenbus_switch_state(dev, XenbusStateClosing);
2149-
wait_event(module_unload_q,
2145+
wait_event(module_wq,
21502146
xenbus_read_driver_state(dev->otherend) ==
21512147
XenbusStateClosing ||
21522148
xenbus_read_driver_state(dev->otherend) ==
21532149
XenbusStateUnknown);
21542150

21552151
xenbus_switch_state(dev, XenbusStateClosed);
2156-
wait_event(module_unload_q,
2152+
wait_event(module_wq,
21572153
xenbus_read_driver_state(dev->otherend) ==
21582154
XenbusStateClosed ||
21592155
xenbus_read_driver_state(dev->otherend) ==

0 commit comments

Comments
 (0)