diff --git a/drivers/usb/usbip/usbip_event.c b/drivers/usb/usbip/usbip_event.c index 0e00c2d000f8..e498102e8b26 100644 --- a/drivers/usb/usbip/usbip_event.c +++ b/drivers/usb/usbip/usbip_event.c @@ -105,6 +105,11 @@ int usbip_start_eh(struct usbip_device *ud) } EXPORT_SYMBOL_GPL(usbip_start_eh); +#define WORK_QUEUE_NAME "usbip_event" + +static struct workqueue_struct *usbip_queue; +static DECLARE_WORK(usbip_work, event_handler); + void usbip_stop_eh(struct usbip_device *ud) { unsigned long pending = ud->event & ~USBIP_EH_BYE; @@ -115,16 +120,12 @@ void usbip_stop_eh(struct usbip_device *ud) if (pending) usbip_dbg_eh("usbip_eh waiting completion %lx\n", pending); - wait_event_interruptible(ud->eh_waitq, !(ud->event & ~USBIP_EH_BYE)); + wait_event(ud->eh_waitq, !(ud->event & ~USBIP_EH_BYE)); + flush_workqueue(usbip_queue); usbip_dbg_eh("usbip_eh has stopped\n"); } EXPORT_SYMBOL_GPL(usbip_stop_eh); -#define WORK_QUEUE_NAME "usbip_event" - -static struct workqueue_struct *usbip_queue; -static DECLARE_WORK(usbip_work, event_handler); - int usbip_init_eh(void) { usbip_queue = create_singlethread_workqueue(WORK_QUEUE_NAME);