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. 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@xxxxxxxxxxxxxxxxx http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies