web-dev-qa-db-ja.com

LinuxでのIOMMUサポートの確認

PCIパススルーがサポートされているかどうか、特定のLinuxマシンで確認したいと思います。少しグーグルで調べた後、IOMMUがサポートされているかどうかを確認する必要があることがわかりました。

dmesg | grep IOMMU   

IOMMU(IOMMUv2ではなく)をサポートしている場合、次のようになります:

IOMMU                                                          
[    0.000000] DMAR: IOMMU enabled
[    0.049734] DMAR-IR: IOAPIC id 8 under DRHD base  0xfbffc000 IOMMU 0
[    0.049735] DMAR-IR: IOAPIC id 9 under DRHD base  0xfbffc000 IOMMU 0
[    1.286567] AMD IOMMUv2 driver by Joerg Roedel <[email protected]>
[    1.286568] AMD IOMMUv2 functionality not available on this system

...どこ DMAR: IOMMU enabledは私が探しているものです。

これで、マシンが再起動せずに数日間実行されている場合、その最初のメッセージ[ 0.000000] DMAR: IOMMU enabledは、前のコマンドでログに表示されなくなる可能性があります。

そのメッセージがログから消えたときにIOMMUサポートを確認する方法はありますか?

7
Ricky Robinson

2014年以降、有効なiommuはクラスiommuとして/ sys(sysfs)特殊ファイルシステムに登録されています( ABI/testing/sysfs-class-iomm で文書化されています): https://patchwork.kernel .org/patch/4345491 / 「[2/3] iommu/intel:IOMMU sysfsサポートを利用する」-2014年6月12日

DRHD IOMMU、クロスリンクデバイスを登録し、IOMMUの基本属性セットを提供します。 ...典型的なデスクトップシステムでは、これにより以下が(プルーニング)提供されます。

$ find /sys | grep dmar
/sys/devices/virtual/iommu/dmar0
...
/sys/class/iommu/dmar0
/sys/class/iommu/dmar1

コードはiommu_device_createhttp://elixir.free-electrons.com/linux/v4.5/ident/iommu_device_create 、約4.5)またはiommu_device_sysfs_addhttp://elixir.free-electrons.com/linux/v4.11/ident/iommu_device_sysfs_add )最近のカーネルでは。

/*
 * Create an IOMMU device and return a pointer to it.  IOMMU specific
 * attributes can be provided as an attribute group, allowing a unique
 * namespace per IOMMU type.
 */
struct device *iommu_device_create(struct device *parent, void *drvdata,
                   const struct attribute_group **groups,
                   const char *fmt, ...)

登録は、有効なIOMMUに対してのみ行われます。 DMAR:

if (intel_iommu_enabled) {
    iommu->iommu_dev = iommu_device_create(NULL, iommu,
                           intel_iommu_groups,
                           "%s", iommu->name);

AMD IOMMU:

static int iommu_init_pci(struct AMD_iommu *iommu)
{ ...
    if (!iommu->dev)
        return -ENODEV;
...
    iommu->iommu_dev = iommu_device_create(&iommu->dev->dev, iommu,
                           AMD_iommu_groups, "ivhd%d",
                           iommu->index);

Intel:

int __init intel_iommu_init(void)
{ ...
    pr_info("Intel(R) Virtualization Technology for Directed I/O\n");
...
    for_each_active_iommu(iommu, drhd)
        iommu->iommu_dev = iommu_device_create(NULL, iommu,
                               intel_iommu_groups,
                               "%s", iommu->name);

4.11 Linuxカーネルバージョンiommu_device_sysfs_add多くのIOMMUドライバーで参照される なので、/ sys/class/iommuをチェックすることは、dmesg出力を解析するか/var/log/kern.logまたは/var/log/messagesドライバー固有の有効化メッセージの場合:

10個のファイルで参照:

  • drivers/iommu/AMD_iommu_init.c、1640行目
  • drivers/iommu/arm-smmu-v3.c、行2709
  • drivers/iommu/arm-smmu.c、行2163
  • drivers/iommu/dmar.c、行1083
  • drivers/iommu/exynos-iommu.c、623行目
  • drivers/iommu/intel-iommu.c、行4878
  • drivers/iommu/iommu-sysfs.c、57行目
  • drivers/iommu/msm_iommu.c、行797
  • drivers/iommu/mtk_iommu.c、ライン581
7
osgx