POWER9 eXternal Interrupt Virtualization Engine (XIVE Gen1)
- 対応するデバイスタイプ:
KVM_DEV_TYPE_XIVE POWER9 XIVE 割り込みコントローラ 第 1 世代
このデバイスは VM の割り込みコントローラとして動作する。下位の POWER9 XIVE 割り込みコントローラにおいて、VM の割り込みソースを設定するための KVM インターフェースを提供する。
XIVE インスタンスは一つだけ作成できる。ゲストの XIVE デバイスには POWER9 ホストが必要であり、ゲスト OS は XIVE ネイティブ活用割り込み モードをサポートしているべきである。そうでない場合は、XICS (POWER7/8) と呼ばれるレガシー割り込みモードで動かすべきである。
デバイスのマッピング
KVM デバイスは、割り込み管理に必要な XIVE ハードウェアのさまざまな MMIO 範囲を公開する。これらは、独自の VM フォールトハンドラが populate する VMA でゲストに公開される。
スレッド割り込み管理領域 (TIMA)
各スレッドには、レジスタの集合からなるスレッド割り込み管理コンテキスト が対応付けられている。これらのレジスタにより、スレッドは優先度の管理と 割り込みのアクノリッジを行える。最も重要なものは次のとおりである。
Interrupt Pending Buffer (IPB)
Current Processor Priority (CPPR)
Notification Source Register (NSR)
これらは、それぞれ異なる特権のビューを提供する 4 つのページとして ソフトウェアに公開される。1 ページ目は物理スレッドコンテキスト用で、 2 ページ目はハイパーバイザ用である。ゲストに公開されるのは 3 番目 (オペレーティングシステム) と 4 番目 (ユーザレベル) だけである。
イベントステートバッファ (ESB)
各ソースにはイベントステートバッファ (ESB) が対応付けられ、偶数/奇数 の一対のページでソースを管理するコマンド (たとえばトリガ、EOI、 ソースのオフ) を提供する。
デバイスのパススルー
デバイスがゲストにパススルーされると、割り込みソースは別のハードウェア コントローラ (PHB4) のものになり、ゲストに公開される ESB ページは この変更に対応する必要がある。
デバイスのハードウェア IRQ がゲストの IRQ 番号空間にマップまたは アンマップされるときに、passthru_irq ヘルパ kvmppc_xive_set_mapped() と kvmppc_xive_clr_mapped() が呼ばれる。KVM デバイスはこれらのヘルパを 拡張し、マップされるゲスト IRQ 番号の ESB ページをクリアしてから、 VM フォールトハンドラに再 populate させる。ハンドラは、パススルーされる デバイスのハードウェア割り込みに対応する ESB ページ、またはデバイスが 削除された場合は初期の IPI ESB ページを挿入する。
ESB の再マッピングはゲストと OS のデバイスドライバにとって完全に 透過である。処理はすべて VFIO と KVM-PPC の上記のヘルパの中で行われる。
グループ:
- KVM_DEV_XIVE_GRP_CTRL
デバイス全体の制御を提供する
- Attributes:
1.1 KVM_DEV_XIVE_RESET (書き込みのみ) ソースとイベントキューの割り込みコントローラ設定をリセットする。 kexec と kdump で使う。
エラー: なし
1.2 KVM_DEV_XIVE_EQ_SYNC (書き込みのみ) すべてのソースとキューを同期し、EQ ページをダーティにする。VM を マイグレーションするときに一貫したメモリ状態が取り込まれるように するためである。
エラー: なし
1.3 KVM_DEV_XIVE_NR_SERVERS (書き込みのみ) kvm_device_attr.addr は __u32 の値を指し、その値は割り込みサーバ番号の 個数 (すなわち、取りうる最大の vcpu id に 1 を加えたもの) である。
Errors:
-EINVAL
KVM_MAX_VCPU_IDS より大きい値。
-EFAULT
attr->addr のユーザポインタが不正。
-EBUSY
すでに vCPU がデバイスに接続されている。
- KVM_DEV_XIVE_GRP_SOURCE (書き込みのみ)
XIVE デバイスに新しいソースを初期化し、マスクする。
- Attributes:
割り込みソース番号 (64 ビット)
kvm_device_attr.addr は __u64 の値を指す:
bits: | 63 .... 2 | 1 | 0 values: | unused | level | type
type: 0:MSI 1:LSI
level: LSI の場合のアサーションレベル。
Errors:
-E2BIG
割り込みソース番号が範囲外
-ENOMEM
新しいソースブロックを作成できなかった
-EFAULT
attr->addr のユーザポインタが不正。
-ENXIO
下位のハードウェア割り込みを割り当てられなかった
- KVM_DEV_XIVE_GRP_SOURCE_CONFIG (書き込みのみ)
ソースのターゲティングを設定する
- Attributes:
割り込みソース番号 (64 ビット)
kvm_device_attr.addr は __u64 の値を指す:
bits: | 63 .... 33 | 32 | 31 .. 3 | 2 .. 0 values: | eisn | mask | server | priority
priority: 0-7 の割り込み優先度
server: 割り込みを処理するために選ばれた CPU 番号
mask: マスクフラグ (未使用)
eisn: 実効割り込みソース番号
Errors:
-ENOENT
不明なソース番号
-EINVAL
初期化されていないソース番号
-EINVAL
優先度が不正
-EINVAL
CPU 番号が不正。
-EFAULT
attr->addr のユーザポインタが不正。
-ENXIO
CPU のイベントキューが設定されていないか、下位の ハードウェア割り込みの設定に失敗した
-EBUSY
割り込みを処理できる CPU がない
- KVM_DEV_XIVE_GRP_EQ_CONFIG (読み書き)
CPU のイベントキューを設定する
- Attributes:
EQ ディスクリプタ識別子 (64 ビット)
EQ ディスクリプタ識別子は (server, priority) の組である:
bits: | 63 .... 32 | 31 .. 3 | 2 .. 0 values: | unused | server | prioritykvm_device_attr.addr は次を指す:
struct kvm_ppc_xive_eq { __u32 flags; __u32 qshift; __u64 qaddr; __u32 qtoggle; __u32 qindex; __u8 pad[40]; };
- flags: キューフラグ
- KVM_XIVE_EQ_ALWAYS_NOTIFY (必須)
XIVE の END ESB が提供する合体機構を使わずに通知を強制する。
qshift: キューサイズ (2 のべき乗)
qaddr: キューの実アドレス
qtoggle: 現在のキュートグルビット
qindex: 現在のキューインデックス
pad: 将来の使用のために予約済み
Errors:
-ENOENT
CPU 番号が不正
-EINVAL
優先度が不正
-EINVAL
フラグが不正
-EINVAL
キューサイズが不正
-EINVAL
キューアドレスが不正
-EFAULT
attr->addr のユーザポインタが不正。
-EIO
下位のハードウェアの設定に失敗した
- KVM_DEV_XIVE_GRP_SOURCE_SYNC (書き込みのみ)
イベント通知をフラッシュするためにソースを同期する
- Attributes:
割り込みソース番号 (64 ビット)
Errors:
-ENOENT
不明なソース番号
-EINVAL
初期化されていないソース番号
VCPU の状態
XIVE IC は VP の割り込み状態を NVT と呼ばれる内部構造に保持する。VP が ハードウェアプロセッサスレッドにディスパッチされていないとき、VP が イベント通知の対象であれば、この構造はハードウェアによって更新されうる。
マイグレーションでは、NVT からキャッシュされた IPB を取り込むことが 重要である。IPB が保留中の割り込みの優先度を合成するためである。デバッグ 情報を報告するために、もう少し多くを取り込む。
KVM_REG_PPC_VP_STATE (2 * 64bits):
bits: | 63 .... 32 | 31 .... 0 | values: | TIMA word0 | TIMA word1 | bits: | 127 .......... 64 | values: | unused |
マイグレーション:
XIVE ネイティブ活用モードを使う VM の状態の保存は、特定の手順に従う べきである。VM を停止したときは次のとおり。
イベントの流れを止めるために、すべてのソースをマスクする (PQ=01)。
2. KVM の制御 KVM_DEV_XIVE_EQ_SYNC で XIVE デバイスを同期し、処理中の イベント通知をフラッシュして EQ を安定させる。この段階では、 マイグレーションの手順で確実に転送されるように、EQ ページがダーティに される。
3. ソースのターゲティングの状態、EQ の設定、スレッド割り込みコンテキスト レジスタの状態を取り込む。
復元も同様である。
EQ の設定を復元する。ターゲティングがこれに依存するためである。
ターゲティングを復元する
スレッド割り込みコンテキストを復元する
ソースの状態を復元する
vCPU を実行させる