我有一个阻塞等待事件的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时才存在的紧密循环吗?
答案 0 :(得分:1)
如果您的线程不可冻结(默认情况下),它将由内核核心自动挂起/休眠。所以,你可以重复等待(实际上,它会在重新开始后重复)。
如果您将线程标记为freezable,如果出现此类信号,您应该手动调用try_to_freeze()或使用wait_event_freezable_timeout宏,它会自动调用它(但您还应该检查此信号并重新启动等待。)
有关冻结kthreads的更多信息,请参阅内核源代码中的Documentation/power/freezing-of-tasks.txt
。