Hi On Tue, Feb 19, 2013 at 1:16 AM, Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com> wrote:
On 02/19/2013 02:07 PM, Kevin Wilson wrote:
Hi all, I am trying to send a SIGKILL to a kernel module which is sleeping. I added a printk after the sleep command. Sending a SIGLKILL (by kill -9 SIGLKILL pidOfKernelThread) does **not** yield the message from printk("calling do_exit\n"); which is immediately after the msleep() command, as I expected.
Moreover, ps before and after the kill show 'D' in the STAT column (STATUS), which means that the process is sleeping (If I am not wrong).
Any ideas why ?
There are 2 ways in which a task can sleep - interruptible sleep and uninterruptible sleep. Interruptible sleep means, the task can get interrupted by a signal. A task doing uninterruptible sleep doesn't get woken up by any signal. The 'D' state indicates that the task is doing uninterruptible sleep, that's why your signals aren't working.
There is one more sleeping state: killable sleep. It is like uninterruptable sleep that can be interrupted only with SIGKILL. http://lwn.net/Articles/288056/
Regards, Srivatsa S. Bhat
below is the code:
#include<linux/init.h> #include<linux/module.h> #include<linux/kernel.h> #include<linux/kthread.h> #include<linux/sched.h> #include <linux/delay.h>
struct task_struct *task;
int thread_function(void *data) { int exit_sig = SIGKILL;
allow_signal(SIGKILL);
printk("in %s\n",__func__); // sleep for a second msleep(60000); printk("calling do_exit\n"); do_exit(exit_sig);
return 0; }
static int kernel_init(void) { task = kthread_create(thread_function,NULL,"MY_KERNEL_THREAD"); return 0; }
static void kernel_exit(void) { printk("in kernel_exit\n"); kthread_stop(task); }
module_init(kernel_init); module_exit(kernel_exit);
MODULE_AUTHOR("Tester"); MODULE_DESCRIPTION("test"); MODULE_LICENSE("GPL");
rgs, Kevin
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies