OpenBSD Hackathon h2k9 Day7
昨日AM5時過ぎまでハックしてたので、超のんびり起床。
昼飯は買ったけど食わずに残ってたビスケットとリンゴだけにして、夜に備える。
デッドロックの件について調べを進めた所、
cpu0がフォールト→カーネルロック取得→uvm_fault呼び出し→TLB shootdown→cpu1へIPI割り込み→割り込みハンドラがカーネルロックを取得しようとしてデッドロック
となっている事が分かり、IPI割り込みの時はロックを取得しないように変更。
しかし、今度は
cpu0: フォールト→カーネルロック取得→uvm_fault呼び出し→TLB shootdown
cpu1: cpu0がカーネルロックを取得後、IPI割り込みがかかる前までにクロック割り込みが発生→カーネルロックを取得しようとしてデッドロック
となった。
これは、クロック割り込みのハンドラでもIPI割り込みを受けられるようにすべきで、かつIPI割り込み時は(割り込み優先度で)他の割り込みをマスクすべきという話になった。
このパッチを実装した所、cpu1でスケジューラを開始せずTLB shootdownのみを走らせるテストは完全に動作した。
が、cpu1でスケジューラを走らせるとtrapにハマって死んでしまう問題が解決せず。
trap()時のステータスを追ってみると、cpu_switchto()でcurcpu()->ci_curprocpaddrを踏んで死んでる事が判明。
この変数は設定してないのでNULLになってしまっている。
多分、proc0paddrを設定すれば良いのかな?と思って入れてみると、trapはしなくなった。
しかし、またもやデッドロックが発生。
結局どういう理由でデッドロックしているのかまでは追いきれず。
PM7時か8時ごろにyuo@たちと夕食へ。
どの店に入るかで少し悩んだけど結局日曜日にランチを食べた店で食べる事に。
この店は英語メニューがあって助かる。
今度はMonk fish riceとFish soupというのを頼んでみる。
Fish soupはまさかのパンの中に入ってるスープ。巨大。これだけでランチに最適。
Monk fish riceはyuo@の奥さんと2人で同じものを頼んだら、何故か4人前くらい出てきてビビる。
ワインもコーヒーも飲んだら満腹過ぎて死にそうだった。
夜は1時くらいまでデバッグを続けたが結局解けず。
皆とビール飲みに行って結局3時まで飲んでた。