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 になっている (かも?)
- 先に blkno および rablkno について読み込み処理を kick してます
むむ、時間無い。breada はもう少し掘りたい。