From stern@rowland.harvard.edu Thu Apr 5 13:05:36 2007 From: Alan Stern Date: Thu, 5 Apr 2007 16:05:33 -0400 (EDT) Subject: USB: make the autosuspend workqueue thread freezable To: Greg KH Cc: USB development list Message-ID: This patch (as881) makes the ksuspend_usb_wq workqueue freezable. We don't want a rogue workqueue thread running around, unexpectedly suspending or resuming USB devices in the middle of a system sleep transition. Signed-off-by: Alan Stern Signed-off-by: Greg Kroah-Hartman --- drivers/usb/core/usb.c | 3 ++- include/linux/workqueue.h | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) --- a/drivers/usb/core/usb.c +++ b/drivers/usb/core/usb.c @@ -206,7 +206,8 @@ struct device_type usb_device_type = { static int ksuspend_usb_init(void) { - ksuspend_usb_wq = create_singlethread_workqueue("ksuspend_usbd"); + ksuspend_usb_wq = create_singlethread_freezeable_workqueue( + "ksuspend_usbd"); if (!ksuspend_usb_wq) return -ENOMEM; return 0; --- a/include/linux/workqueue.h +++ b/include/linux/workqueue.h @@ -164,6 +164,8 @@ extern struct workqueue_struct *__create #define create_workqueue(name) __create_workqueue((name), 0, 0) #define create_freezeable_workqueue(name) __create_workqueue((name), 0, 1) #define create_singlethread_workqueue(name) __create_workqueue((name), 1, 0) +#define create_singlethread_freezeable_workqueue(name) \ + __create_workqueue((name), 1, 1) extern void destroy_workqueue(struct workqueue_struct *wq);