OpenBSD Hackathon h2k9 Day5

明け方近くまで起きてたのでかなりのろのろと起床。
ホテルの入り口でhackerに会ったので一緒に出勤。

昨日、コードをクリーンアップした後にIPIが動かなくなった理由を探る。
単にKASSERTの条件が逆になってるだけだった。
つまり、ちゃんと動いてたという訳だ。
コードの整理を続けているうちにyuo@にお昼に誘われ街へ繰り出す。
食べる所が決まらずグルグルあるいて、結局2回行ったイタリアンの店の近くのレストランに入る事にした。

僕が頼んだのはChanfana Tradicional, yuo@のはDourada Assada no Forno c/ Grelosだったと思う。あと、スープも頼んだ。
勿論、僕は何も読めないので肉料理だろうという所まであたりを付けただけで適当に選んだ。
が、しかし、頼んだものが一向に来ない。
三十分以上待たされて、ようやく出てきたのはワインで煮込んだ肉料理だった。
ずっと煮込んでいたらしい…。
待ったかいあって、中々美味だった。
結局全部食べ終わってコーヒーを飲んだら3時近かった。

それからようやくIPIのコードをまとめてdiffを作成、Miod, Joelに送る。
ここで論点になったのは、IPI自体じゃなくて割り込みハンドラの登録ルーチンで使われ値得るmalloc()。
cpu1から呼ぶ時にmalloc()があると仮想アドレスを踏んで死んでしまう。
これは基本的にはpmapがSMP対応していないせいなのだが、pmapをSMP対応させTLBをコヒーレントに保つにはIPIが必要な訳で、そのIPIを初期化するコードでcpu1上でバーチャルアドレスの解決を試行して良いのか?
多分、おかしくなるよね。
だから構造体をスタティックにアロケートして使うコードを書いた。

これに対してMiodは、kstackの時と同様にcpu0で動的にアロケートして物理アドレスに変換してからcpu1へ渡すべきだと返してきた。
で、kstackの時のように数ページを跨がるような量アロケートしたい時はuvm_pglistalloc, 小さい時はmallocを使うsmp_malloc()を実装すれば良いんじゃないかと言われたので、作ってみた。

これはテストして動いてるっぽいのでまずはsmp_malloc()のdiffを作ってレビュー→コミット。

IPIのコードも動いてるのでdiffを作ってメールしたけど、この時点でもう夜中になっててMiodが飲みにいってしまい、返事は明日へ持ち越し。

まだ夜は長い!という事でpmapの実装を開始。
FreeBSD/mipsのpmap実装を参考に、smp_rendezvousを移植してきたりpmapのそこら中に手を入れたりして一応完成するが、なぜかまたIPIがかからないバグが発生。

結局IPIがかからないままAM 2:30に退散。

あ、そうそう、今日は作業の途中に二度コーヒーを飲みに行った。
この国のコーヒーは確かにおいしい。