FreeBSD 2009/08末~の変更についての覚え書き

FreeBSDで、2009/08末からいろいろ変更が入って、遭遇しまくったので、解決方法の覚書。

・Citrix Xen Server 5.5で、ブート時にpmap_invalidate_cache_range() で、Fatal Trap 9でkernel panicが発生する。原因は、Xen ServerのCLFLUSHエミュレーションがおかしいようで、/usr/src/sys/i386/i386/pmap.c 内で、clflush() を実行するとダメなようだ。暫定対策として、以下のパッチを当てて実行しないようにするとブートする。
対象は、RELENG_8 / HEAD。

% diff -aurN sys/i386/i386/pmap.c.original sys/i386/i386/pmap.c
--- sys/i386/i386/pmap.c.original 2009-09-22 20:15:55.000000000 +0900
+++ sys/i386/i386/pmap.c 2009-09-22 20:16:44.000000000 +0900
@@ -992,8 +992,9 @@
KASSERT((eva & PAGE_MASK) == 0,
("pmap_invalidate_cache_range: eva not page-aligned"));

- if (cpu_feature & CPUID_SS)
+ if (cpu_feature & CPUID_SS) {
; /* If "Self Snoop" is supported, do nothing. */
+#if 0
else if (cpu_feature & CPUID_CLFSH) {

/*
@@ -1007,6 +1008,7 @@
for (; sva < eva; sva += cpu_clflush_line_size)
clflush(sva);
mfence();
+#endif
} else {

・IPv6でリンクローカルアドレスが付かないなど、IPv6周りの不具合
HEADで、IPv6周りに大幅に手が入り、/etc/defaults/rc.conf が
・ipv6_enable="YES" の定義がobsolete行き
・ipv6_network_interfaces="auto" -> ipv6_network_interfaces="none" に変更
になった。

IPv6を使用している環境で、ブート時のメッセージに従って、ipv6_enable="YES"のみ削除すると、IPv6周りの挙動が変更され、リンクローカルアドレスが付かないとか、L2TPトンネルが張れないとか、いろいろ変な動作を起こしてしまう。解決方法としては、/etc/rc.conf に、
ipv6_network_interfaces="auto"
を追加しておけばとりあえずオッケーそう。

・EtherIPのバグ修正
RELENG_7に、EtherIP利用時に、他OSとの通信ができない不具合を直すパッチ関連がMFCされた。必要な人はRELENG_7に上げると良いかも。

→2009/10/01 追記
pmap_invalidate_cache_range() で、Fatal Trap 9でkernel panic の問題は、AMD製のCPUを使用していて、なおかつ仮想化環境で起きることを確認(つまり、Intel CPUでは問題なし)。んで、 r197663にて、同じ修正が入ったっぽい。MFC 3 daysってあるので、10/4には確認できるかな。

→2009/10/14 追記
r197663は、Intel CPUしか想定してないのでダメじゃん。ってことで、最新のソースに対して、以下のパッチを追加で当てることによって、ブート可能になることを確認。
# diff -u sys/i386/i386/initcpu.c.original sys/i386/i386/initcpu.c
--- sys/i386/i386/initcpu.c.original 2009-10-01 21:52:48.000000000 +0900
+++ sys/i386/i386/initcpu.c 2009-10-14 23:52:27.491591571 +0900
@@ -723,6 +723,8 @@
*/
if (cpu_vendor_id == CPU_VENDOR_INTEL && !(cpu_feature & CPUID_SS))
cpu_feature &= ~CPUID_CLFSH;
+ if (cpu_vendor_id == CPU_VENDOR_AMD && !(cpu_feature & CPUID_SS))
+ cpu_feature &= ~CPUID_CLFSH;

#if defined(PC98) && !defined(CPU_UPGRADE_HW_CACHE)
/*

→2009/11/09追記
kuriyamaさんにより、r199067 として暫定的に修正されました。新たに、hw.clflush_disable が追加されました。デフォルトは-1で、CPUID_SSが使えない場合(Xen or HYPER-Vの環境)では、CPUID_CLFSHを無効にします。 0にすればこれまで通りの挙動、1にすれば強制的にCPUID_CLFSHを無効にします。8.0-RELEASEに入るかどうかは微妙ですが、とりあえず-CURRENTでは問題がなくなるかと思います。

→2010/05/31追記
Citrix Xen Server 5.6.0が出たので、FreeBSD-9.0-CURRENT-201004-i386-disc1.iso でインストールしてみたが相変わらずダメでした。8-BETA1や9-CURRENTでは、強制的にCLFLUSHを無効にする方法が実装されているでの、ブートの際に、「6」を選んでプロンプトを出し、
OK set hw.clflush_disable=1
OK boot
として、インストールを続行してください。更に、最近のFreeBSDは、何故かVMをsingle CPUにしてやらないとインストールが出来ないという、摩訶不思議な状態になってます。一回インストールしてやれば、SMPでも動くようなので(だけど、カスタムカーネルでいろいろオプションを削ると動かないとかしないと動かなかったり、なんか変)、とりあえずインストールと、カーネル再構築は1 CPUで行ってみてください。

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント