防止任务被安排

Prevent task from being scheduled

我有一个 sysfs 接口,在写入时应该阻止写入任务执行,直到满足某些条件。

解锁条件为:

if(tsk->wait_time > MAX_WAIT_PERIOD || tsk->condition_met) {
    // Unblock task and let it run again
}

由于条件的性质,我认为 schedule_timeout 不是使用的正确机制;或者至少,我还没有弄清楚如何使用它然后取消等待时间/适当地向进程发出信号。

我也尝试在 sysfs 上手动执行以下操作:

...
__set_current_state(TASK_INTERRUPTIBLE);
schedule();
...

然后当条件满足时:

if(tsk->wait_time > MAX_WAIT_PERIOD || tsk->condition_met) {
    set_task_state(tsk, TASK_RUNNING);
}

这导致:BUG: scheduling while atomic: dummyThread/2622/0x00000002
考虑到 schedule_timeout 几乎 几乎 完全相同的逻辑,我怀疑它也会导致相同的 BUG: scheduling while atomic: ... 错误。

我也尝试过 deactivate_taskactivate_task 方法,但它们会在调度程序的 pick_next_task 链中引起内核恐慌。如果需要,我将重新实现它和 post 堆栈跟踪。

在满足某些条件之前阻止任务 运行 的正确方法是什么?

schedule_timeout() 是用于定时等待的良好低级函数。

但是set_task_state()是唤醒的错误选择:这个函数主要针对当前线程。相反,使用 wake_up_processwake_up_state.