在 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