Skip to content

Commit c2d2e67

Browse files
jandryukjgross1
authored andcommitted
xen-netfront: Fix hang on device removal
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: 5b5971d ("xen-netfront: remove warning when unloading module") Signed-off-by: Jason Andryuk <jandryuk@gmail.com> Cc: Eduardo Otubo <otubo@redhat.com> Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com> Signed-off-by: Juergen Gross <jgross@suse.com>
1 parent 910f8be commit c2d2e67

File tree

1 file changed

+6
-1
lines changed

1 file changed

+6
-1
lines changed

drivers/net/xen-netfront.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2005,7 +2005,10 @@ static void netback_changed(struct xenbus_device *dev,
20052005
case XenbusStateInitialised:
20062006
case XenbusStateReconfiguring:
20072007
case XenbusStateReconfigured:
2008+
break;
2009+
20082010
case XenbusStateUnknown:
2011+
wake_up_all(&module_unload_q);
20092012
break;
20102013

20112014
case XenbusStateInitWait:
@@ -2136,7 +2139,9 @@ static int xennet_remove(struct xenbus_device *dev)
21362139
xenbus_switch_state(dev, XenbusStateClosing);
21372140
wait_event(module_unload_q,
21382141
xenbus_read_driver_state(dev->otherend) ==
2139-
XenbusStateClosing);
2142+
XenbusStateClosing ||
2143+
xenbus_read_driver_state(dev->otherend) ==
2144+
XenbusStateUnknown);
21402145

21412146
xenbus_switch_state(dev, XenbusStateClosed);
21422147
wait_event(module_unload_q,

0 commit comments

Comments
 (0)