Lions' 本読み (128)

朝練メモ。getblk 手続きをもう少し確認など。
incore な探索をして失敗して以降の処理をざっくり確認。

  • 割り込みブロックして bfreelist の av_ なリストの空き確認
    • 空きが無ければ sleep (別途確認必要)
    • 空きがあれば割り込みブロック解除
  • notavail を呼び出して bfreelist.av_forw を av_ なリストから外す
  • 外した要素のステイタスが DELWRI の場合
    • ステイタスに ASYNC を追加して bwrite 手続き呼び出し
    • loop に戻る (このあたりも別途確認必要)
  • bfreelist から取り出した要素の初期設定
    • bfreelist の b_ なリストから除去
    • dp の b_ なリストの先頭に追加

ええと、bfreelist の av_ なリストに空きが無い場合 sleep してます。bfreelist の av_ なリストに戻すのは brelse 手続きでした (他にもあるのかどうなのか)。

4875    rbp = bp;
4876    if (rbp->b_flags&B_WANTED)
4877            wakeup(rbp);
4878    if (bfreelist.b_flags&B_WANTED) {
4879            bfreelist.b_flags =& ~B_WANTED;
4880            wakeup(&bfreelist);
4881    }

ちなみにバッファのどこか (rbp とか bp とか) で sleep するのも getblk 手続きに記述が存在してました。incore てき探索して見つかったけど BUSY だった場合。ちなみに incore で同様なソレの記述が無いけれど、呼び出し元で云々してるのかな、と思ったら呼び出し元は二箇所しかなくって、どちらも戻り値を使って、ということはしておりませんでした (どちらも breada 手続き)。

read/write をバッファ観点でざっくり確認

  • bread 手続き
    • getblk でバッファ確保
    • 取ってきたバッファの b_flags に B_DONE が立ってると終わり
    • 読み込み処理を kick して終わるまで sleep
      • これって iodone の呼び出しが wakeup の契機なのかな
      • rkintr 手続きから iodone 手続きの呼び出しがありますね
  • breada
    • 先に blkno および rablkno について読み込み処理を kick してます
      • getblk して読み込み rkstrategy 手続き呼び出し
      • rablkno の場合、brelse したりしてますがここではスルー
    • その後、blkno の bread を呼び出し
      • getblk した時点で B_DONE になっている (かも?)

むむ、時間無い。breada はもう少し掘りたい。