E.2. IOMMU グループの詳細
IOMMU グループは、IOMMU の観点から分離されているとみなされる最も小さなデバイスセットとして定義されます。分離を実行するために必要な最初の手順は、詳細度 (granularity) の使用です。IOMMU がデバイスを別個の IOVA 空間に区分できない場合、それらは分離されません。たとえば、複数のデバイスが同一 IOVA 空間のエイリアスになる場合、IOMMU はそれらを区別することができません。これは、通常の x86 PC がすべての従来型の PCI デバイスに同一リクエスター ID に対するエイリアスを設定してそれらを 1 つにまとめる方法になります (PCIe-to-PCI ブリッジ)。レガシー KVM デバイスの割り当てでは、ユーザーはこれらの従来型 PCI デバイスを別々に割り当てるため、IOMMU はデバイス間を区別できずに設定は失敗します。VFIO は IOMMU グループで管理されるため、VFIO は IOMMU の詳細度の使用というこの最も基本的な要件を満たさない設定を許可しません。
次の手順として、デバイスからのトランザクションが IOMMU に実際に到達するかどうかを判別する必要があります。PCIe 仕様では、トランザクションを相互接続ファブリック内に再度ルート指定できます。PCIe ダウンストリームポートは、あるダウンストリームデバイスから別のデバイスへのトランザクションを再度ルート指定できます。PCIe スイッチのダウンストリームポートは相互に接続し、1 つのポートから別のポートへの再ルート指定を可能にします。マルチファンクションエンドポイントデバイス内でも、1 つの機能からのトランザクションは別のファンクションに直接送信できます。これらの 1 つのデバイスから別のデバイスへのトランザクションはピアツーピアトランザクションと呼ばれ、別々の IOV 空間で稼働しているデバイスの分離を破棄する可能性があります。たとえば、ゲスト仮想マシンに割り当てられているネットワークインターフェイスカードが DMA の書き込み操作を独自の IOV 空間内の仮想アドレスに試行するとします。ただし、物理空間ではその同じアドレスはホストによって所有されているピアディスクコントローラーに属します。この場合、デバイスについての物理変換に対する IOVA は IOMMU のみで実行されるため、トランザクションのデータパスの最適化を試行する相互接続により、ディスクへの DMA 書き込み操作が、変換用に IOMMU に到達する前に間違ってリダイレクトされる可能性があります。
この問題を解決するために、PCI Express 仕様には、これらのリダイレクトの可視性とコントロールを提供する PCIe Access Control Services (ACS) のサポートが含まれます。これは相互接続やマルチファンクションエンドポイントに欠落していることの多い、デバイスを相互に分離するために必要なコンポーネントです。デバイスから IOMMU へのすべてのレベルで ACS サポートがない場合も、リダイレクトが生じることを想定する必要があります。このため、ACS サポートがない場合、PCI トポロジーのすべてのデバイスの分離に影響があります。PCI 環境の IOMMU グループはこの分離を考慮に入れて、変換されないピアツーピア DMA が可能な複数のデバイスを 1 つにグループ化します。
要約すると、IOMMU グループは、IOMMU が可視性を持ち、他のグループから分離される最小単位のデバイスセットを表します。VFIO はこの情報を使用してユーザー空間についてデバイスの安全な所有権を確保します。ブリッジ、root ポートおよびスイッチ (相互接続ファブリックの例すべて) の例外を除き、IOMMU グループ内のすべてのデバイスは VFIO デバイスドライバーにバインドされるか、安全なスタブドライバーとして認識されます。PCI の場合、これらのドライバーは vfio-pci と pci-stub です。pci-stub は、ホストがこのドライバーを介してデバイスと対話していないため簡単に許可されます。[2].VFIO の使用時にグループが実行不可能であることを示すエラーが発生した場合、このグループ内のすべてのデバイスが適切なホストドライバーにバインドする必要があることを意味します。virsh nodedev-dumpxml を使用して IOMU グループの設定を調べ、virsh nodedev-detach を使用してデバイスを VFIO 互換ドライバーにバインドすると、このような問題を解決できます。
[2]
例外は、レガシーの KVM デバイスの割り当てで、pci-stub ドライバーにバインドしている間デバイスと対話します。Red Hat Enterprise Linux 7 にはレガシー KVM デバイス割り当てが含まれないため、この対話と潜在的な競合の発生を防ぎます。Red Hat Enterprise Linux 7 にはレガシー KVM デバイス割り当てが含まれないため、この相互対話と潜在的な衝突が回避されます。