FLIC (フローティング割り込みコントローラ)
FLIC は、フローティング (CPU ごとではない) 割り込み、つまり I/O、サービス、および一部の マシンチェック割り込みを扱う。すべての割り込みは、VM ごとの保留中割り込みリストに 格納される。FLIC はこのリストに対して操作を行う。
FLIC インスタンスは 1 つだけ生成できる。
FLIC は次をサポートする。 - 割り込みの追加 (KVM_DEV_FLIC_ENQUEUE) - 現在保留中の割り込みの検査 (KVM_FLIC_GET_ALL_IRQS) - 保留中のフローティング割り込みのすべてをパージ (KVM_DEV_FLIC_CLEAR_IRQS) - 保留中のフローティング I/O 割り込みを 1 つパージ (KVM_DEV_FLIC_CLEAR_IO_IRQ) - ゲストの透過的な非同期ページフォールトの有効化/無効化 - アダプタ割り込みソースの登録と変更 (KVM_DEV_FLIC_ADAPTER_*) - AIS (アダプタ割り込み抑制) モード状態の変更 (KVM_DEV_FLIC_AISM) - 指定されたアダプタでアダプタ割り込みを注入 (KVM_DEV_FLIC_AIRQ_INJECT) - すべての AIS モード状態の取得/設定 (KVM_DEV_FLIC_AISM_ALL)
- Groups:
- KVM_DEV_FLIC_ENQUEUE
バッファと長さをカーネルに渡し、それらは保留中割り込みのリストに注入される。 attr->addr にはバッファへのポインタが入り、attr->attr にはバッファの長さが入る。 ユーザ空間からコピーされるデータ構造 kvm_s390_irq の形式は、 usr/include/linux/kvm.h で定義されている。
- KVM_DEV_FLIC_GET_ALL_IRQS
すべてのフローティング割り込みを、ユーザ空間が提供するバッファにコピーする。 バッファが小さすぎる場合は -ENOMEM を返す。これは、ユーザ空間がより大きなバッファで 再試行すべきことを示す。
カーネル空間バッファの割り当てに失敗した場合は -ENOBUFS を返す。
ユーザ空間へのデータのコピーに失敗した場合は -EFAULT を返す。 すべての割り込みは保留中のままであり、つまり現在保留中の割り込みのリストから 削除されない。 attr->addr には、すべての割り込みデータがコピーされるバッファのユーザ空間アドレスが入る。 attr->attr には、バッファのサイズ (バイト単位) が入る。
- KVM_DEV_FLIC_CLEAR_IRQS
現在保留中のフローティング割り込みのリストから、すべての要素を単純に削除する。 ゲストには割り込みは注入されない。
- KVM_DEV_FLIC_CLEAR_IO_IRQ
attr->addr (アドレス) と attr->attr (長さ) で指定されるバッファを介して渡される サブシステム識別ワードで識別されるサブチャネルの I/O 割り込みを 1 つ (存在する場合) 削除する。
- KVM_DEV_FLIC_APF_ENABLE
ゲストの非同期ページフォールトを有効にする。したがって、メジャーページフォールトの場合は、 ホストがこれを非同期に処理し、ゲストを続行できる。
ucontrol VM の FLIC で呼び出された場合は -EINVAL を返す。
- KVM_DEV_FLIC_APF_DISABLE_WAIT
ゲストの非同期ページフォールトを無効にし、すでに保留中の非同期ページフォールトが完了するまで待つ。 これは、割り込みリストをマイグレーションする前に、すべての init 割り込みに対して 完了割り込みを発生させるために必要である。
ucontrol VM の FLIC で呼び出された場合は -EINVAL を返す。
- KVM_DEV_FLIC_ADAPTER_REGISTER
I/O アダプタ割り込みソースを登録する。登録するアダプタを記述する kvm_s390_io_adapter を受け取る:
struct kvm_s390_io_adapter { __u32 id; __u8 isc; __u8 maskable; __u8 swap; __u8 flags; };
id にはアダプタの一意な ID が入り、isc には使用する I/O 割り込みサブクラスが入る。 maskable はこのアダプタをマスクできるか (割り込みをオフにできるか) を示し、 swap はインジケータをバイトスワップする必要があるかを示し、flags には アダプタのさらなる特性が入る。
'flags' に現在定義されている値は次のとおりである。
KVM_S390_ADAPTER_SUPPRESSIBLE: アダプタは AIS (アダプタ割り込み抑制) 機能の対象である。このフラグは、AIS ケイパビリティが 有効な場合にのみ効果がある。
未知のフラグ値は無視される。
- KVM_DEV_FLIC_ADAPTER_MODIFY
既存の I/O アダプタ割り込みソースの属性を変更する。アダプタと操作を指定する kvm_s390_io_adapter_req を受け取る:
struct kvm_s390_io_adapter_req { __u32 id; __u8 type; __u8 mask; __u16 pad0; __u64 addr; };
id はアダプタを指定し、type は操作を指定する。サポートされる操作は次のとおりである。
- KVM_S390_IO_ADAPTER_MASK
mask で指定されたとおりにアダプタをマスクまたはマスク解除する
- KVM_S390_IO_ADAPTER_MAP
アダプタのインジケータまたはサマリページを長期ピンのためにマップし、 アトミックコンテキストで割り込み注入を実行できるようにする。長期ピンが 不可能な場合 (例: ファイルバックのメモリ)、ページは短期ピンで検証され、 ioctl は成功を返す。割り込み注入は、割り込みごとに短期ピンを使う 非アトミックな irqfd パスを使う。Secure Execution モードではこれは 何もしない操作であり、ioctl は成功を返す。
- KVM_S390_IO_ADAPTER_UNMAP
以前にマップしたアダプタのインジケータまたはサマリページをアンマップし、 長期ピンを解放する。ページが長期ピンされていなかった場合 (例: ファイルバックの メモリ)、マップエントリは削除され、成功が返る。以前のマップエントリが 存在しない場合は -ENOENT を返す。Secure Execution モードではこれは 何もしない操作であり、ioctl は成功を返す。
- KVM_DEV_FLIC_AISM
AIS ケイパビリティが有効な場合、指定された isc のアダプタ割り込み抑制モードを変更する。 次を記述する kvm_s390_ais_req を受け取る:
struct kvm_s390_ais_req { __u8 isc; __u16 mode; };
isc には対象の I/O 割り込みサブクラスが入り、mode には対象の アダプタ割り込み抑制モードが入る。現在サポートされるモードは次のとおりである。
KVM_S390_AIS_MODE_ALL: ALL-Interruptions モード。つまり airq 注入は 常に許可される。
KVM_S390_AIS_MODE_SINGLE: SINGLE-Interruption モード。つまり airq 注入は 1 回だけ許可され、以降のアダプタ割り込みは、モードが再び ALL-Interruptions または SINGLE-Interruption モードに設定されるまで抑制される。
- KVM_DEV_FLIC_AIRQ_INJECT
指定されたアダプタでアダプタ割り込みを注入する。 attr->attr にはアダプタの一意な ID が入り、これによりアダプタ固有の チェックとアクションが可能になる。 AIS の対象となるアダプタについては、AIS ケイパビリティが有効であることを条件に、 アダプタ割り込み抑制モードに従って isc の airq 注入抑制を処理する。
- KVM_DEV_FLIC_AISM_ALL
すべての ISC のアダプタ割り込み抑制モードを取得または設定する。 次を記述する kvm_s390_ais_all を受け取る:
struct kvm_s390_ais_all { __u8 simm; /* Single-Interruption-Mode mask */ __u8 nimm; /* No-Interruption-Mode mask * };
simm にはすべての ISC の Single-Interruption-Mode マスクが入り、nimm には すべての ISC の No-Interruption-Mode マスクが入る。simm と nimm の各ビットは 1 つの ISC に対応する (MSB0 ビット 0 は ISC 0 に対応、以下同様)。simm ビットと nimm ビットの組み合わせが、ISC の AIS モードを表す。
KVM_DEV_FLIC_AISM_ALL は KVM_CAP_S390_AIS_MIGRATION で示される。
備考: 未知のグループまたは属性で FLIC に対して実行される KVM_SET_DEVICE_ATTR/KVM_GET_DEVICE_ATTR デバイス ioctl は、エラーコード EINVAL を返す (API ドキュメントで規定されている ENXIO の代わりに)。使用の試行から生じる エラーコードに基づいて、FLIC 操作が利用できないと結論付けることはできない。
注釈
KVM_DEV_FLIC_CLEAR_IO_IRQ ioctl は、schid がゼロの場合に EINVAL を返す。