vhost: a kernel-level virtio server

KVMのMLで、vhost: a kernel-level virtio serverが話題になっています.

これまで準仮想化の標準インターフェースとされてきた virtio は、専用のPCIバイスVMに認識させ、そのデバイスを経由してホストにIOを要求していました. この際、KVMQemuのコードを利用しているため、virtioに用いられるのPCIバイスのエミュレーションはユーザ空間で行われていました. このフローを表したものが以下の図です.

この方式の難点は、IOの要求を行う度に、
1.VMX non Root モードから VMX root モードに遷移し、
2.ホストのカーネルがユーザ空間に一旦処理を返し、
3.再度IOのためのシステムコールを発行する
といった手順を踏む必要がある点です. ネットワークIOのように粒度が小さいIOが大量に発生する可能性がある場合、従来のvirtio方式では、モード切替によるオーバヘッドが大きく、リソースの無駄遣いが発生してしまいます.

一方、今回提唱されている vhost のフローを以下に示します.

この方式の利点は、
1.virtioの要求を、eventfdを用いることでシグナルライクに行う
2.virtio のエミュレーションをカーネル側で行う
ことで、CPUのモード切替をなくすことができる点です. vhostを用いることで、粒度が小さいIOに対して、大幅な速度改善が見込めるはずです.

気になる点

vhostの気になる点の1つは、IO要求が同期呼び出しではなくなるので、遅延が増えるという点です. 遅延がどの程度になるかはタスクスイッチのタイミングに依存するでしょう.

もう1つ気になる点は、eventfdを用いた通知機構です. ゲストからの通知方法が変更となると、ゲスト側の書き換えが必要となるはずですが、

The main motivation for this work is to reduce virtualization
overhead for virtio by removing system calls on data path,
without guest changes.

と書いてあり、混乱しています. ゲストの書き換えを行っているのかいないのか、どっちなんだろう...?

追記 2009/9/3

Patchworkにパッチ全体がアーカイブされています. 内容を知りたい方はこちらを見るとよいでしょう.