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 はこの情報を使用してユーザー空間での安全なデバイスの所有を可能にします。ブリッジ、ルートポート、およびスイッチ (相互接続ファブリックの例すべて) 以外は、IOMMU グループ内のすべてのデバイスは VFIO デバイスドライバーまたは安全な既知のスタブドライバーにバインドされます。PCI の場合、これらのドライバーは vfio-pci と pci-stub です。pci-stub は、ホストがこのドライバー経由でデバイスと対話しないと認識されているので許可されます[2]。VFIO の使用時にグループが実行不可能であることを示すエラーが発生した場合、このグループ内のすべてのデバイスが適切なホストドライバーにバインドする必要があることを意味します。virsh nodedev-dumpxml を使用して、IOMMU グループの構成を確認し、virsh nodedev-detach を使用してデバイスを VFIO と互換性のあるドライバーにバインドすると、このような問題を解決することができます。


[2] 例外となるのは、レガシー KVM デバイス割り当てで、これは pci-stub ドライバーにバインドされる場合にデバイスと対話することがよくあります。Red Hat Enterprise Linux 7 にはレガシー KVM デバイス割り当てが含まれないため、この対話と潜在的な競合の発生を防ぎます。そのため、同じ IOMMU グループ内で VFIO とレガシー KVM デバイス割り当てを混用することは推奨されません。