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 で追加となる

微妙に中途半端ですが、一旦終わり。