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 でゲストに公開される。

    1. スレッド割り込み管理領域 (TIMA)

    各スレッドには、レジスタの集合からなるスレッド割り込み管理コンテキスト が対応付けられている。これらのレジスタにより、スレッドは優先度の管理と 割り込みのアクノリッジを行える。最も重要なものは次のとおりである。

    • Interrupt Pending Buffer (IPB)

    • Current Processor Priority (CPPR)

    • Notification Source Register (NSR)

    これらは、それぞれ異なる特権のビューを提供する 4 つのページとして ソフトウェアに公開される。1 ページ目は物理スレッドコンテキスト用で、 2 ページ目はハイパーバイザ用である。ゲストに公開されるのは 3 番目 (オペレーティングシステム) と 4 番目 (ユーザレベル) だけである。

    1. イベントステートバッファ (ESB)

    各ソースにはイベントステートバッファ (ESB) が対応付けられ、偶数/奇数 の一対のページでソースを管理するコマンド (たとえばトリガ、EOI、 ソースのオフ) を提供する。

    1. デバイスのパススルー

    デバイスがゲストにパススルーされると、割り込みソースは別のハードウェア コントローラ (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 の上記のヘルパの中で行われる。

  • グループ:

  1. 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 がデバイスに接続されている。

  1. 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

下位のハードウェア割り込みを割り当てられなかった

  1. 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 がない

  1. KVM_DEV_XIVE_GRP_EQ_CONFIG (読み書き)

    CPU のイベントキューを設定する

Attributes:

EQ ディスクリプタ識別子 (64 ビット)

EQ ディスクリプタ識別子は (server, priority) の組である:

bits:     | 63   ....  32 | 31 .. 3 |  2 .. 0
values:   |    unused     |  server | priority

kvm_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

下位のハードウェアの設定に失敗した

  1. 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 を停止したときは次のとおり。

    1. イベントの流れを止めるために、すべてのソースをマスクする (PQ=01)。

    2. KVM の制御 KVM_DEV_XIVE_EQ_SYNC で XIVE デバイスを同期し、処理中の イベント通知をフラッシュして EQ を安定させる。この段階では、 マイグレーションの手順で確実に転送されるように、EQ ページがダーティに される。

    3. ソースのターゲティングの状態、EQ の設定、スレッド割り込みコンテキスト レジスタの状態を取り込む。

    復元も同様である。

    1. EQ の設定を復元する。ターゲティングがこれに依存するためである。

    2. ターゲティングを復元する

    3. スレッド割り込みコンテキストを復元する

    4. ソースの状態を復元する

    5. vCPU を実行させる