OpenBSD Hackathon h2k9 Day3


前日の雰囲気では、夜遅くまで起きてて朝は誰も起きてこない感じだったので、じゃあたっぷり寝坊しよう!と10:00頃までのんびり寝てた。
出るのものんびりだったので、着くのは11時頃になってまう、と思いつつもカメラを持って近くの庭園を散歩。
学校まで庭園から坂を登って行けると思ったが、道への入り口が警備員によって封鎖されていた。(日曜だから?)

仕方がないので入り口まで戻って、坂を登ってハッカソンルームへ到着。
SMP対応クロックのパッチを整理してメールするなどしてたら、yuo@さんに誘われて昼飯に行く事に(朝飯食ってないのでブランチ?)

メインストリートまで降りてみるも、日曜だから何も開いてないねぇ…とうろうろすると、教会の近くにポルトガル料理のレストランらしきものが。メニューに英語も書いてある。
入ってメニューを眺めたが、良く分からないのでフィーリングで頼んでみた。
魚が出て来るのかと思ったら、Octpusとか一言も書いてないのにタコ料理が出てきた!
タコを焼いたものにオイルや香草、タマネギとかがたっぷり乗ってて、ジャガイモとか野菜が付いてきてるような感じ。タコにはレモン付いてきてた。
yuo@さんのはお魚とジャガイモのグリル?オリーブオイルたっぷりな感じの奴。
シェアして食べたけど、両方とも美味しかった。が、多すぎて食い切れなかった…無念。
ついでにグリーンワインというのも初めて頂いた。微発砲のすっきりしたワインで、これはかなり飲みやすい。美味しい。

帰りに焼き栗を売ってるおばあさんの所で12コ入りの栗を1€で買った。安い。

限界まで食べたので、後はもう昼寝をするだけだという所でハッカソンルームへ帰還。

SMP対応クロックのコードをテストしていたら、何だか時折sched_lockがロックされてないとかでKASSERTで落ちるのに気付く。
これは、クロック割り込みハンドラの中でKERNEL_LOCK() / KERNEL_UNLOCK()を呼んだ時に起きていた。
JoelとMiodが話し合った所、割り込み時にKERNEL_LOCK() / KERNEL_UNLOCK()は使わず、単に__mp_lock(&kernel_lock)で良いのではないかという事で決着、コミットする。

ちゃんと動くようになったか確かめる為に色々Octane上で動かして見ていたら、topコマンドを実行するとCPU0, CPU1, CPU2と3つCPUが表示されている事に気付く。(すげー!CPU3つで動いてる!とJoel, Miod爆笑
まぁ、ncpusとncpufoundという二つのグローバル変数のインクリメントが正しく行われていないのが原因だった。
(int ncpus = 1で初期化されていたのに、cpu0の分までインクリメントしていたのが原因)
さくさく直してコミット。

cpu1が起動した直後に実行されるcpu_hatch()でcurcpu()->ci_cpuidをprintf()すると0が返る事に気付く。
何故cpu1のcpuidが0なんだよ、と。
更に色々弄っていると、スタックから正しい値がロード出来ない事にも気付く。
よくよく考えたら、まだpmap.cをSMP対応化してないのでcpu1はバーチャルアドレスにアクセス出来ないはず(ページテーブルにアクセスしようとかしているうちに不整合を起こしてデータを壊したりするはず)。
なのに、cpu_info構造体もスタックも動的にアロケートしてバーチャルアドレスで渡してしまっているではないか。

という訳で、一時的な回避策としてcpu_infoとスタックをスタティック変数としてアロケートするコードを書いて、Miodに送ってみた。

そしたら、君が言いたい事はよくわからんけどブートストラップスタックを仮想アドレスにするのは少なくとも間違っているとの指摘が。
連続したページをアロケートして、これの物理アドレスを取得してcpu1へ渡すべき、との事で、macppcを見てみるとそのようなコードが入っていたからこれを参考に実装、テストして動いたのでコミット。

その後、またsched_lockの所でKASSERTして止まる現象を確認したのでよく見たらsoftintでもクロックのときと同様にKENREL_LOCKを呼んでたので__mp_lockに書き換えようとしたのだが、よく考えると割り込みハンドラのディスパッチをやっているinterrupt()で既にロックかけてるんだよね。個々の割り込みハンドラでもう一度ロックかける必要なくね?それダブルロックしてるよってJoelに言ったら、あーたしかにそうだ。という話になって、クロックからもsoftintからもロックを削除。
これでめでたく止まらなくなりました。

その後、いよいよIPIだ!という訳で以前実装したIPIのコードを持ってきてcurrentのコードに突っ込んでごにょごにょするも動かず。
どーも、ipiを受け取ったときに正しくディスパッチせずにフリーズしている。
多分、割り込みのペンディングフラグがクリアされないから永久にディスパッチ試行しつづけてる?
どうなっているのか、明日さらに詳しく調べてみる。
結局AM 2:00までコードかいてた。

今日の夕食は、昼に買った栗でした。お昼多かったからいいけど、それにしても一日一食は体に悪そう。