VA Linux Systems Japan株式会社

ホーム 検索 お問い合わせ

English

 
 

 

ホーム VA Tech.Top テックライブラリーTop kvm上でNetBSD/amd64を動かす 4

update : 2009/11/15

 

index

Xen特集

テックライブラリ

NetBSD/amd64をkvm上で動かす

 

1

症状

2

デバッグの手順

3

修正箇所1

4

修正箇所2

 

プレゼンライブラリ

イベントレポート

tips

VA Virtual-suite

仮想化に関するレポート販売

Xenを使ってみよう

Kernel対応障害解析サービス VA Quest

Linux Virtual Server Project

信頼性の高いロードバランサ である「VA Balance」

大規模メーセージングソリューション「FMS」

 
 


kvm上でNetBSD/amd64を動かす

qemu/hw/rtl8139.c

ネットワークデバイスにも問題があります。インストールCDからshellを実行し、

# dhclient re0

# ping 10.0.2.2

を実行すると【図 re-timeout】のとおりとなります。

図re-timeout.

【図 re-timeout】

図を大きく表示する

watchdog timeoutというのは、大抵の場合は送信側でうまく割り込みが発生していないことが原因ですので、その推測のもとに調査を進めます。

まず、kvm-84/qemu/hw/rtl8139.c内でコメントアウトされているDEBUG_RTL8139の#defineを有効にして、デバッグメッセージを表示させます。
大量のデバッグメッセージが表示されますが、送信と関係がありそうな部分の抜粋を以下に示します。

【 デバッグメッセージ抜粋 】

別ウィンドウで開く

最後の行のSet IRQ to 0というのが気になりますが、これは「TxOKビットは立ったが、その割り込みはマスクされていて割り込みは発生しない」という意味です。rtl8139.c内を IntrStatusおよびrtl8139_update_irqで検索してみると、送信に関する割り込みはTxOKしか発生しないようになっています。
NetBSDのドライバにおいて、送信の割り込みを処理するのはre_txeof()であり、以下の条件のときに呼ばれます。

if (status & (RTK_ISR_TIMEOUT_EXPIRED | RTK_ISR_TX_ERR |

RTK_ISR_TX_DESC_UNAVAIL))

re_txeof(sc);

RTK_ISR_TX_DESC_UNAVAILという名前からすると、送信デスクリプタが空になった場合に割り込みを発生させてまとめて処理するようになっているかとも思われますが、チップのマニュアルを取得するにはNDAが必要となり、またqemuはこの割り込みを発生させないので、これ以上の追求は差し控えます。

 

気をとりなおして、RTK_ISR_TIMEOUT_EXPIREDを調べることにします。これはqemuではPCSTimeoutという名前であり、実装されてはいるものの、#ifdef RTL8139_ONBOARD_TIMERで無効になっていて、rtl8139.cの冒頭のコメント内のchangelogにもdisableされていると記載されています。

また、このタイマはNetBSDのドライバでは以下の箇所で初期化されており、コメントからこれがTxOKの代わりに用いられていることがわかります。

/*
* Main transmit routine for C+ and gigE NICs.
*/

static void
re_start(struct ifnet *ifp)
{
(略)
        /*
         * Use the countdown timer for interrupt moderation.
         * 'TX done' interrupts are disabled. Instead, we reset the
         * countdown timer, which will begin counting until it hits
         * the value in the TIMERINT register, and then trigger an
         * interrupt. Each time we write to the TIMERCNT register,
         * the timer count is reset to 0.
         */
        CSR_WRITE_4(sc, RTK_TIMERCNT, 1);

        /*
         * Set a timeout in case the chip goes out to lunch.
         */
        ifp->if_timer = 5;
    }
}

対処としては、RTL8139_ONBOARD_TIMERを#defineしてコンパイルすることで、watchdog timeoutは起きなくなり正常に動作するようになります。このタイマはPCIの33MHzのクロックで動くカウンタを使っているようですが、qemuの実装では、このカウンタを律儀に1ずつインクリメントしようとしており、これがCPU負荷を発生させるためdefaultではdisableされているのではないかと思われます。

 

カウンタは1ずつインクリメントしなくても、必要になったときに計算すればいいように思われます。Linuxではタイマを使ってないので実装を手抜きしたのでしょうか?
念のためにCPU負荷をtopで観察すると1%程度なのか4割程度なのか判断しかねるデータが得られました。

【 CPU負荷の観察 】

別ウィンドウで開く

topコマンドは、CPU統計は/proc/stat、プロセスのCPU%は/proc/n/statのutime+stimeの差分から取得しています。また、shellのtimeコマンドを使用してCPUの消費時間を測定すると、それも異なる数値が得られました。

この件もデバッグの題材としてはおもしろそうですが、本題からそれてしまいますので、 kernel.orgから執筆時点での最新版であるlinux-2.6.29.6を取得し、カーネルのみ入れかえて再測定を行いました。

ゲストOSのidle時にはCPU負荷は1%未満である測定結果が得られ、RTL8139_ONBOARD_TIMERを有効にしてもCPU負荷的には問題はないということが確認できました。

 

ちなみにLinuxのドライバではTxOKは最初は有効になっているのですが、TxOK割り込みが発生すると割り込みハンドラでTxOKがマスクされて無効になり、__napi_schedule()が呼ばれ、rtl8169_poll()から(タイミングによっては)まとめて処理されるようになっています。

まとめ

今回は以下の箇所に修正を加えました。

仮想マシンBIOSのMP table
NetBSDのACPI実装
仮想マシンのネットワークデバイス

これらの修正により、起動すらできなかったNetBSD/amd64が、特にエラーメッセージを発することもなく正常に動作するようになりました。

 

戻る


 
 
本サイトの利用に関して 免責事項 コピーライト 個人情報保護方針

Copyright C VA Linux Systems Japan. All rights reserved.