防止任务被安排

时间:2016-10-29 16:19:27

标签: linux-kernel scheduling

我有一个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链中的内核出现混乱。如果需要,我将重新实现并发布堆栈跟踪。

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

1 个答案:

答案 0 :(得分:1)

schedule_timeout()是定时等待的良好低级功能。

set_task_state()是唤醒的不错选择:此函数主要用于当前线程。相反,请使用wake_up_processwake_up_state