在 kthread 中处理 ERESTARTSYS 的最佳方式?
Best way to handle ERESTARTSYS in kthread?
我有一个 kthread 在等待事件上阻塞,直到达到超时。但是,如果系统事件中断它(例如系统进入挂起状态),它 returns -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 return ERESTARTSYS,内核会重新启动线程吗?我是否应该将 wait_event_interruptible_timeout
放入一个仅在 return 为 0 时才存在的紧密循环中?
如果您的线程不可冻结(默认情况下),它将由内核核心自动 suspended/hibernated。所以,你可以重复等待(物理上,恢复后会重复)。
如果您将线程标记为可冻结,在出现此类信号的情况下,您应该手动调用 try_to_freeze() 或使用自动调用它的 wait_event_freezable_timeout 宏(但您还应该检查此发出信号并重新开始等待)。
有关冻结 kthread 的更多信息,请参阅内核源代码中的 Documentation/power/freezing-of-tasks.txt
。
我有一个 kthread 在等待事件上阻塞,直到达到超时。但是,如果系统事件中断它(例如系统进入挂起状态),它 returns -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 return ERESTARTSYS,内核会重新启动线程吗?我是否应该将 wait_event_interruptible_timeout
放入一个仅在 return 为 0 时才存在的紧密循环中?
如果您的线程不可冻结(默认情况下),它将由内核核心自动 suspended/hibernated。所以,你可以重复等待(物理上,恢复后会重复)。
如果您将线程标记为可冻结,在出现此类信号的情况下,您应该手动调用 try_to_freeze() 或使用自动调用它的 wait_event_freezable_timeout 宏(但您还应该检查此发出信号并重新开始等待)。
有关冻结 kthread 的更多信息,请参阅内核源代码中的 Documentation/power/freezing-of-tasks.txt
。