Prevent task from being scheduled
I have a sysfs interface which when written to should prevent the writing task from executing until certain conditions are met.
The condition for unblocking is of the form:
if(tsk->wait_time > MAX_WAIT_PERIOD || tsk->condition_met) {
// Unblock task and let it run again
}
Because of the nature of the condition, I don't think schedule_timeout is the right mechanism to use; or at least, I haven't figured out how to use it and then cancel the wait time / appropriately signal the process.
I have also tried manually doing the following on the sysfs write:
...
__set_current_state(TASK_INTERRUPTIBLE);
schedule();
...
And then when the condition is satisfied:
if(tsk->wait_time > MAX_WAIT_PERIOD || tsk->condition_met) {
set_task_state(tsk, TASK_RUNNING);
}
This results in: BUG: scheduling while atomic: dummyThread/2622/0x00000002
Given how, schedule_timeout does almost the exact same logic, I suspect that it would also cause the same BUG: scheduling while atomic: ... error.
I have also tried the deactivate_task and activate_task methods, but they cause a kernel panic in the scheduler's pick_next_task chain. If required, I will re-implement this and post the stack trace.
What is the right way to prevent a task from running until certain conditions are met?
schedule_timeout() is good low-level function for timed wait.
But set_task_state() is bad choice for wake up: this function is mainly for current thread. Instead, use wake_up_process or wake_up_state .
上一篇: 为什么不能通过硬件中断直接调用schedule()?
下一篇: 防止任务被安排
