カーネルモジュールから、タスクリストを繰り返し処理し、task->flagが設定されているすべてのプロセスに対してスリープ状態の操作を実行したいと思います。read_lock(tasklist_lock)/ rcu_read_lockを押し続けることで、眠い操作をしてはいけないことがわかります。だから私は以下のようにコーディングしました:
1.読み取りロック
を取得します2.タスクを反復処理します(for_each_process)3
.フラグが設定されている場合は、tasklist_lockとget_task_structのロックを解除します4.次にスリープ
操作を実行します
5.Put_task_struct
6.もう一度read_lock(&tasklist_lock);を取得します。
7.ループは続く
read_lock(&tasklist_lock);
for_each_process(c) {
if (c->my_flag) {
read_unlock(&tasklist_lock);
get_task_struct(c);
...
Do some sleepy_operation()
...
put_task_struct(c);
read_lock(&tasklist_lock);
}
}
私のアプローチが正しいかどうか教えてください