OpenBSD Hackathon h2k9 Day2

前日かなり寝不足だったので起きれるか不安だったが、慣れない寝床なせいか目覚ましで直ぐに起床。
8:45。
ほぼ2日ぶりのシャワーをゆっくり浴びて準備。
朝飯はホテルで食べた。
ビュッフェ形式でメニューはパン4種類、ハム、チーズ、シリアル、ヨーグルト、ミックスフルーツ(フルーツポンチみたいな缶詰めで売ってそうな奴)、コーヒー、紅茶、ミルク、オレンジジュース。
はっきり言って、あれじゃ二日食ったら飽きる。
ここがイギリスだと思い込めば嬉しくなってくるメニューの豊富さだけどさ、この国ご飯は美味しいはずなのよね。日本のように朝飯をちゃんと食う習慣はないんだろうな。

飯が終わった後は歯磨きして、昔書いたコードをMac OS XのパーティーションからOpenBSDのパーティーションへコピー※したりしながらゆっくり準備(※OpenBSD以外を起動出来ない雰囲気なので)。

10時にホテルを出て、たどり着けるかなー?と疑問に思いつつも、何か遺跡のような建物の遺構沿いの坂を登っていけば大学なはず、と思って歩いていったら大学発見。
そこからHackathon roomを探し出すにはもう少し掛かったけど、まぁ、そんなに迷わなかった。
あはー、随分遅くなっちゃったかなーと思いながら部屋に入るとMiod, Theoと後もう一人くらいしか居ない。
ああ、皆昨日は僕が帰った後も飲んでてまだ寝てるのね。

昨日少し手を付けたmplockのデバッグを再開。
Joelが横に座ってデバッグを色々手伝ってくれる。
問題は、initプロセスが起動して暫くすると_kernel_proc_unlock()が呼ばれた時にlock not heldって出てpanicするというものだったんだけど、debug printを入れてコードを追っていくとkernel_lock.mpl_countが2の時(ロックが1度行われているだけ)に_kernel_proc_unlock()が2回呼ばれている事が分かった。
更に色々見てみると、_kernel_proc_lock(p) / _kernel_proc_unlock(p)はp->p_flagsにP_BIGLOCKというフラグをbit演算でセット・アンセットしており、これがセットされている時にのみmi_switch()で切り替え前にhold_count = _mp_release_all(&kernel_lock)、復帰後に_mp_acquire_count(&kernel_lock, hold_count)が実行され、コンテキスイッチのような要領で現在のkernel_lock.mpl_countを退避・復帰させている事が分かった。
panicするpid 1(/sbin/init)が動作している時にどの関数が呼ばれてkernel_lock.mpl_countがどうなっていくか
を辿っていくと、既にロックされている時にtrap.cからもう一度ロックを呼んで直ぐにアンロックする事によってP_BIGLOCKフラグが外れてしまい、hold_countの退避・復帰が行われていない事が分かった。
ありゃまー。と思いながら問題のtrap.cのfault_common:の中の、uvm_fault()前後に突っ込んだKERNEL_PROC_LOCK() / KERNEL_PROC_UNLOCK()をコメントアウトするとあっさり動き出したので、二人でウンウン悩んで既にロックされてる時はKERNEL_PROC_LOCK() / KERNEL_PROC_UNLOCK()を呼ぶのを辞めよう、という実装を行ってみたが、jsingがMiodに聞いたらその場所はカーネルモードな場合があるよ、その時はKERNEL_PROC_LOCK()じゃなくてKERNEL_LOCK()だよ、との事。
ですよね。カーネルモードと共用してるコードだとは気がつきませんでした。
結局この問題はそこを直したら解決。

話は前後するけど、これをやってる途中にお昼ご飯を食べに行った。
ご飯とお肉のプレートに野菜スープ、ぶどうを食べた、これで6€。
味は…薄かった。
皆とっとと食べ終わってて焦ってぶどう食った。
次から周りと同じ時間に食べ終わるという観点で注文を考えるべきか。

話は戻って、jsingと考えたもう一つの問題。
__mp_lock()で使ってる__cpu_cas()をrw_casとしてdefineするマクロを組むとフリーズするという現象について考えた。
そもそもキミの書いた__cpu_cas()、rw_casと仕様違うじゃん。と言われて焦った。
おー、NetBSDの実装をそのままパクろうとしたのが敗因だった。
OpenBSDの場合、値は結果を0,1で返すだけなのだが、NetBSDの実装では現在値を返すようになってたのかな。
でも、これを書き直しても動かず、よーく見たらnopが一個必要だった。
この修正でrw_casも動くようになり、ロック周りはほぼ完璧になった模様。

更に余った時間でclockのSMP化に手を付ける。
直ぐに動くようになったが、Miodにコーディング上の問題でダメ出しを食らって修正中。

夕食は少しだけ豪華なレストランで食べた。
頼んだのは、豚肉の何か。何が出てくるのか皆目検討がつかなかったが、出てきたら濃厚ホワイトソースがたっぷりかけてある豚肉で、美味しいかもだけど胸焼けした。
そして今度は味が濃い。
ワインも頂く。こちらは中々いけた。

結局クロックの修正ができ上がらないまま、AM 1:00になる所でHackathonルームを後にした。

本日の成果

mplockとrw_casを完成させてコミットした。
cpu1でのクロック割り込みを実装した。