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