2

カーネルモジュールから、タスクリストを繰り返し処理し、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);

            }
    }

私のアプローチが正しいかどうか教えてください

4

0 に答える 0