防止任务被安排

我有一个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链中导致内核恐慌。 如果需要,我会重新实现这个并发布堆栈跟踪。

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


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

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

链接地址: http://www.djcxy.com/p/14857.html

上一篇: Prevent task from being scheduled

下一篇: Multilevel feedback queue scheduling