kvm パッチのレビューチェックリスト

  1. パッチは Documentation/process/coding-style.rst と Documentation/process/submitting-patches.rst に従わなければならない。

  2. パッチは kvm.git の master または next ブランチに対して作るべきである。

  3. パッチが新しいユーザ空間 API を導入または変更する場合: - その API は Documentation/virt/kvm/api.rst に文書化しなければならない - その API は KVM_CHECK_EXTENSION で見つけられなければならない

  4. 新しい状態には、保存/復元への対応を含めなければならない。

  5. 新しい機能はデフォルトで無効にしなければならない(ユーザ空間が明示的に 要求するべきである)。性能改善は、デフォルトで有効にでき、また有効に するべきである。

  6. 新しい CPU 機能は、KVM_GET_SUPPORTED_CPUID2、あるいは x86 以外の アーキテクチャにおける同等の仕組みを通して公開するべきである

  7. その機能はテスト可能であるべきである(後述)。

  8. 変更は、可能な限りベンダー中立であるべきである。共通コードへの変更は、 ベンダー固有のコードへの変更を重複させるよりよい。

  9. 同様に、アーキテクチャ依存のコードより、アーキテクチャ非依存のコードへの 変更を優先する。

  10. ユーザ/カーネルインターフェースとゲスト/ホストインターフェースは、 64 ビットクリーンでなければならない(すべての変数とサイズが 64 ビットで 自然に整列し、具体的な型だけを使う。ulong ではなく u64)。

  11. ゲストから見える新しい機能は、ハードウェアマニュアルに文書化されているか、 ドキュメントを伴っていなければならない。

KVM コードのテスト

KVM に貢献するすべての機能は、多くの場合バグ修正も含めて、何らかのテストや、 オープンソースのゲストと VMM での有効化を伴うべきである。KVM を対象とする テストスイートには次のものがある:

Selftests

低レベルのテストで、カーネル API を細かくテストできる。API の失敗シナリオ、 特定のゲスト命令の後に API を呼び出す場合、1 つのテスト内で KVM_CREATE_VM を複数回呼び出す場合のテストを含む。カーネルツリーの tools/testing/selftests/kvm に含まれている。

kvm-unit-tests

ゲストの視点で CPU とエミュレートされたデバイスの機能をテストする、小さな ゲストの集まり。QEMU や kvmtool 上で動き、一般に KVM 固有ではない。 QEMU が対応する任意のアクセラレータや、ベアメタルでも動かせるため、 ハイパーバイザやプロセッサファミリをまたいで動作を比較できる。

Functional test suites

QEMU の tests/functional スイートや avocado-vt など、さまざまな機能テストの組が存在する。これらは通常、完全な オペレーティングシステムを仮想マシンで動かす。

最適なテスト方法は、機能の複雑さと動作内容によって変わる。以下に例と指針を 示す:

New instructions (no new registers or APIs)

対応する CPU 機能があれば、QEMU で使えるようにするべきである。命令が KVM でのエミュレーション対応やその他のコードを必要とするなら、 kvm-unit-tests や selftests にテストを追加する価値がある。命令が、 すでに selftests のカバレッジが十分な API に関係するなら、後者のほうが よい選択になりうる。

New hardware features (new registers, no new APIs)

これらは kvm-unit-tests でテストするべきである。これは多かれ少なかれ、 QEMU や kvmtool で対応することを意味する。場合によっては、前の例と 同様に selftests を代わりに使える。ゲスト状態の保存/復元のコーナーケースを テストするために使うこともできる。

Bug fixes and performance improvements

これらは通常、新しい API を導入しないが、自分の貢献を検証するベンチマークや テストは共有する価値がある。できれば回帰テストの形がよい。テストと ベンチマークは、変更の内容に応じて kvm-unit-tests か selftests の どちらかに含められる。selftests は Linux のツリーに直接含まれるため、 回帰テストに特に役立つ。

Large scale internal changes

単一の方針を示すのは難しいが、変更したコードが kvm-unit-tests か selftests のどちらかでテストされているようにするべきである。影響を受ける コードがどのゲストでも実行される場合は、機能テストで十分なこともある。 カバーレターでテストの手順を説明する。既存のテストスイートの不足を 見つける助けになるためである。

New APIs

自分のユースケースを示すことが重要である。その機能がベアメタルですでに 使われていると説明するだけでもよいし、ユーザ空間での概念実証の実装でもよい。 後者はオープンソースである必要はないが、テストしやすいため当然ながら オープンソースのほうがよい。selftests では API のコーナーケースをテストする べきであり、その機能を使うオープンソースの VMM がなければ、ホストとゲストの 基本的な動作もテストするべきである。

Bigger features, usually spanning host and guest

これらは Linux ゲストで対応するべきである。例外は限定的で、Windows ゲストで テストできる Hyper-V の機能が該当する。その機能が、QEMU や crosvm の 少なくとも一方など、オープンソースのホスト VMM とゲストファームウェアで 使えることが強く望ましい。selftests では少なくとも API のエラーケースを テストするべきである。ゲストの動作は、selftests か kvm-unit-tests の どちらかでテストできる(これは準仮想化機能と Windows 専用機能で特に重要)。 十分な selftests のカバレッジは、オープンソースの VMM での実装の代わりにも なりうるが、一般に勧められない。

selftests と kvm-unit-tests でのテストについて以上の提案に従うと、 メンテナがあなたのコードをレビューして受け入れやすくなる。実際のところ、 変更をアップストリームに貢献する前から、KVM 向けの開発がしやすくなる。

もちろん、KVM のメンテナはより多くのテストを要求する権利を留保する。ただし、 要求をその都度免除することもある。