SIGKILL and a sleeping kernel module

Srivatsa S. Bhat srivatsa.bhat at linux.vnet.ibm.com
Tue Feb 19 04:16:16 EST 2013


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
> 




More information about the Kernelnewbies mailing list