在kthread中处理ERESTARTSYS的最佳方法?

时间:2015-06-12 20:56:31

标签: thread-safety kernel kernel-module

我有一个阻塞等待事件的kthread,直到达到超时。但是,如果系统事件中断它(例如系统进入挂起状态),则返回-ERESTARTSYS。我很想知道如何处理这种情况,因为我不想让kthread死掉,只要等到处理系统范围的事件(例如暂停)。

    while (!kthread_should_stop()) {
        const int timeout_ms = 30000;

        rc = wait_event_interruptible_timeout(_wq,
            kthread_should_stop(),
            msecs_to_jiffies(timeout_ms));

        /* How to handle -ERESTARTSYS??? */
        if (rc)
            return rc; /* maybe return it?? */

        if (kthread_should_stop())
            break;

        /* do processing ... */
    }

如果我要从kthread返回ERESTARTSYS,内核会重启线程吗?我应该将wait_event_interruptible_timeout放入一个仅在它返回0时才存在的紧密循环吗?

1 个答案:

答案 0 :(得分:1)

如果您的线程不可冻结(默认情况下),它将由内核核心自动挂起/休眠。所以,你可以重复等待(实际上,它会在重新开始后重复)。

如果您将线程标记为freezable,如果出现此类信号,您应该手动调用try_to_freeze()或使用wait_event_freezable_timeout宏,它会自动调用它(但您还应该检查此信号并重新启动等待。)

有关冻结kthreads的更多信息,请参阅内核源代码中的Documentation/power/freezing-of-tasks.txt