防止任务被安排
我有一个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_task
和activate_task
方法,但是它们在调度器的pick_next_task
链中导致内核恐慌。 如果需要,我会重新实现这个并发布堆栈跟踪。
在某些条件满足之前,阻止任务运行的正确方法是什么?
schedule_timeout()
是定时等待的良好低级函数。
但是set_task_state()
是唤醒的不错选择:这个函数主要针对当前线程。 相反,请使用wake_up_process
或wake_up_state
。