SIGKILL and a sleeping kernel module

Anatol Pomozov anatol.pomozov at gmail.com
Tue Feb 19 14:54:41 EST 2013


Hi

On Tue, Feb 19, 2013 at 1:16 AM, Srivatsa S. Bhat
<srivatsa.bhat at 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 at kernelnewbies.org
> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies



More information about the Kernelnewbies mailing list