pdflush
1. 概要
pdflushはページキャッシュ(ディスクキャッシュ)上のDirtyページをディスクへ書き戻す(WriteBack)のに使われるカーネルスレッド。
2. 構造
pdflushの構造は図1のようになっている。
図1 pdflushの構造
3. 解説
3.1 pdflush
pdflushの処理のメインは__pdflush()。__pdflush()では、pdflush_operation()によりジョブが投入されてWakeupされると、自分のジョブ管理用構造体struct pdflush_workから登録されているジョブの処理ルーチン(.fn)を呼び出して、WriteBack処理を行う。処理が終わるとまたSleepする。
pdflushカーネルスレッドはシステム内に複数個存在する。スレッド数はWriteBackの処理量に応じてMIN_PDFLUSH_THREADS(2)〜MAX_PDFLUSH_THREADS(8)の間で自動で調整される。このスレッド数の調整も__pdflush()で行われている。
各pdflushは自分のWriteBackジョブを管理するためにstruct pdflush_workを1つ持っている(my_workポインタの先)。Sleepしているpdflushのpdflush_workはpdflush_listにチェーンされている。
3.2 pdflushのWakeup
pdflushへのジョブの投入はpdflush_operation()で行う。pdflush_operation()はpdflushに処理させたいルーチンの関数ポインタ(fn)、ルーチンへの引数(arg0)を引数にとる。
pdflush_operation()はpdflush_listから空いている(Sleepしている)pdflushを取得して、そのpdflushカーネルスレッドをWakeupする。Wakeupの際、選んだpdflush_workをpdflush_listから取り外してfn,arg0に引数で指定されたものを登録しておく。
Wakeupされたpdflushは自分のmy_work(pdflush_work)から関数ポインタを取得して、指定されたWriteBack処理を実行する。