如何唤醒正在睡觉的kthread,以便我可以阻止它?

时间:2016-09-14 22:40:11

标签: multithreading linux-kernel

我的退出功能如下:

static void __exit kMeter_exit(void){
    printk(KERN_INFO "kMeter: Requesting thread stop\n");
    if (task)
        kthread_stop(task);

    printk(KERN_INFO "kMeter: Leaving Kernel Module\n");
}

我的线程功能如下所示:

static int mainTask(void* data)
{
    bool allDone;
    allow_signal(SIGKILL);
    set_current_state(TASK_INTERRUPTIBLE);
    while (!kthread_should_stop())
    {
        set_current_state(TASK_RUNNING);
        allDone = mainLoop();
        set_current_state(TASK_INTERRUPTIBLE);
        if (allDone)
            msleep_interruptible(poll_interval*1000);
        else
            usleep_range(TICK_TIME, TICK_TIME+100);
    }
    return 0;
}

问题在于,当我调用rmmod时,线程没有从睡眠中唤醒,所以我一直卡在那里直到超时发生。根据设置,超时可能长达5分钟。我认为kthread_stop()应该唤醒相关的线程,我认为msleep_interruptible被允许唤醒发生。我错过了什么?

0 个答案:

没有答案