Messages in this thread |  | | | Date | Wed, 9 Nov 2005 16:49:49 +0100 | | From | Aritz Bastida <> | | Subject | Stopping Kernel Threads at module unload time |
| |
Hello
I've got some questions about kernel threads.I am writing a module which spawns some kernel threads, which would be removed when the module unloads. For that purpose i call kthread_stop() at module unload time. When issuing rmmod on the module, it deadlocks at that point (in the call to kthread_stop), and never returns.
In the thread main function the code was something like this (it's of course simplified).
thread_main() { while( ! kthread_should_stop()) { ............. wait_event_interruptible(stop_wq, kthread_should_stop() ); } return 0; } So if kthread_stop() first sets the thread "closing flag", and then calls wake_up_process(), the thread should wake up, see he should stop, and end the loop. That doesnt actually never happen.
I have also tried what it is done in kernel/sched.c to finish:
/* wait for kthread_stop */ set_current_state(TASK_INTERRUPTIBLE); while (!kthread_should_stop()) { schedule(); set_current_state(TASK_INTERRUPTIBLE); } __set_current_state(TASK_RUNNING); return 0; I have ensured it actually arrives to that point by using printks, but when the thread goes to sleep, it does never wake up again, so the call to kthread_stop() lasts forever.
I dont know why this happens. Is the module cleanup code in the context of a user process just like system calls? Can that code sleep? If it can't sleep then the answer would be quite easy: kthread_stop() wakes up the processes and then waits for the threads to finish (on call wait_for_completion), but doesnt actually let them execute, because it cannot sleep, so it deadlocks.
So I would be grateful if anyone can help me in this matter. Regards
Aritz - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
|  |