Lions' 本読み (126)
朝練メモ。getblk 手続き確認など、というよりは構造体の確認か。確認もしつつ各手続きのざっくり確認か。どこまでできるか。
- brelse 手続きでは bfreelist の av_ の末端に引数な struct buf オブジェクトが追加されている
- B_WANTED、B_BUSY、B_ASYNC なフラグ除去
- notavail 手続きでは自分が所属する av_ なリストから自分を抜いている
- B_BUSY フラグを立てている
- 基本的に bfreelist の av_ なリストが処理対象な模様
- incore 手続きでは bdevsw[adev.b_major].dtab の b_forw から始まるリストを手繰っている
- binit 手続き
- bfreelist を b_ なリストも av_ なリストも空にしておく
- bfreelist の b_ なリストの末端に buf 配列を先頭から順に挿入 (全てが添字順に並ぶ形になっているはず)
- rktab (のみ、なのかどうか現時点で不明) の b_ なリストは空にしておく
ここまで確認してる所で、b_ なリストは上記手続きに getblk 手続きを加えたあたりで閉じていることが分かりました。また、av_ なリストについてはこれらに加えて
- bflush 手続き
- rkstrategy 手続き
- rkintr 手続き
で使用されているようです。下二つでは rktab の IO キューを操作する時に av_ なリストを使用している模様。
スルーしている getblk についても整理しておくと
- incore と同様の手段でリストを手繰って同じ dev, blkno の要素があるかを確認
- BUSY な状態なら待ち合わせ
- notavail 呼び出して av_ なリストから除去
- incore なサーチで見つからなかった場合、bfreelist の av_ なリストの先頭から一つ取り出して notavail する
- bfreelist に空き要素な av_ リストが無い場合は待ち合わせる
- これまで所属していた b_ なリストからは脱退
- bdevsw[adev.b_major].dtab の b_ なリストの先頭に追加される
あまり整理できていない気もしますが、これを踏まえて bio.c で定義されている手続きを確認してみれば良いのかどうか。
もう少し
- bfreelist
- av_ なリストはその所属要素を brelse および notavail で入れたり出したり
- b_ なリストは binit で設定されてそのまんま
- む、av_ なリストの初期設定はスルーなのか
- brelse されて初めて?
- 最初らへんの getblk は基本待ち合わせが発生?
- 別途確認
- rktab
- 関連するバッファが b_ なリストで手繰れる
- 基本的には getblk で追加となる
微妙に中途半端ですが、一旦終わり。