<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Feb 19, 2013 at 10:37 AM, Kevin Wilson <span dir="ltr">&lt;<a href="mailto:wkevils@gmail.com" target="_blank">wkevils@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi all,<br>
I am trying to send a SIGKILL to a kernel module which is sleeping.<br>
I added a printk after the sleep command.<br>
Sending a SIGLKILL (by kill -9 SIGLKILL pidOfKernelThread) does **not**<br>
yield the message from printk(&quot;calling do_exit\n&quot;);<br>
 which is immediately after the msleep() command, as I expected.<br>
<br>
Moreover, ps before and after the kill show &#39;D&#39; in the STAT column<br>
(STATUS), which means that the process is sleeping (If I am not<br>
wrong).<br>
<br>
Any ideas why ?<br>
below is the code:<br>
<br>
#include&lt;linux/init.h&gt;<br>
#include&lt;linux/module.h&gt;<br>
#include&lt;linux/kernel.h&gt;<br>
#include&lt;linux/kthread.h&gt;<br>
#include&lt;linux/sched.h&gt;<br>
#include &lt;linux/delay.h&gt;<br>
<br>
struct task_struct *task;<br>
<br>
int thread_function(void *data)<br>
{<br>
    int exit_sig = SIGKILL;<br>
<br>
    allow_signal(SIGKILL);<br>
<br>
    printk(&quot;in %s\n&quot;,__func__);<br>
    // sleep for a second<br>
    msleep(60000);<br>
    printk(&quot;calling do_exit\n&quot;);<br>
    do_exit(exit_sig);<br>
<br>
    return 0;<br>
}<br>
<br>
static int kernel_init(void)<br>
    {<br>
    task = kthread_create(thread_function,NULL,&quot;MY_KERNEL_THREAD&quot;);<br>
    return 0;<br>
}<br>
<br>
static void kernel_exit(void)<br>
    {<br>
    printk(&quot;in kernel_exit\n&quot;);<br>
    kthread_stop(task);<br>
    }<br>
<br>
<br>
module_init(kernel_init);<br>
module_exit(kernel_exit);<br>
<br>
MODULE_AUTHOR(&quot;Tester&quot;);<br>
MODULE_DESCRIPTION(&quot;test&quot;);<br>
MODULE_LICENSE(&quot;GPL&quot;);<br></blockquote></div><br></div><div class="gmail_extra">Hello Kevin!<br><br></div><div class="gmail_extra">According to the man page of ps[1], the D state corresponds to an &quot;Uninterruptible sleep (usually IO)&quot;. That means that signals (such as SIGKILL) will have no effect on the process. Your signal would have worked if the process was in the S state, which is interruptible sleep.<br>
<br></div><div class="gmail_extra">Hope this helps a little.<br></div><div class="gmail_extra"><br><br>[1] <a href="http://linux.die.net/man/1/ps">http://linux.die.net/man/1/ps</a><br clear="all"></div><div class="gmail_extra">
<br>-- <br>Silviu Popescu<br><br>
</div></div>