ChangeSet 1.883.3.11, 2002/12/17 21:49:24-08:00, oliver@neukum.name [PATCH] USB: clean kernel thread exit for speedtouch this makes sure that the kernel thread is dead and gone on module unload. - use a completion to wait for the kernel thread's death diff -Nru a/drivers/usb/misc/speedtouch.c b/drivers/usb/misc/speedtouch.c --- a/drivers/usb/misc/speedtouch.c Wed Dec 18 00:34:36 2002 +++ b/drivers/usb/misc/speedtouch.c Wed Dec 18 00:34:36 2002 @@ -144,8 +144,9 @@ static const char udsl_driver_name[] = "Alcatel SpeedTouch USB"; /* data thread */ -static int datapid = 0; DECLARE_WAIT_QUEUE_HEAD (udsl_wqh); +static DECLARE_COMPLETION(thread_grave); +static unsigned int datapid; #ifdef DEBUG_PACKET int udsl_print_packet (const unsigned char *data, int len); @@ -443,9 +444,9 @@ }; remove_wait_queue (&udsl_wqh, &wait); - datapid = 0; PDEBUG ("SpeedSARd is exiting\n"); - return 0; + complete_and_exit(&thread_grave, 0); + return 0; //never reached } @@ -461,16 +462,7 @@ /* Kill the thread */ ret = kill_proc (datapid, SIGTERM, 1); if (!ret) { - /* Wait 10 seconds */ - int count = 10 * 100; - - while (datapid && --count) { - current->state = TASK_INTERRUPTIBLE; - schedule_timeout (1); - } - - if (!count) - err ("giving up on killing SpeedSAR thread."); + wait_for_completion(&thread_grave); } }