检查IOMMU支持在Linux上

我想validation任何给定的Linux机器是否支持PCI直通。 经过一番Googlesearch之后,我发现我应该检查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 <jroedel@suse.de> [ 1.286568] AMD IOMMUv2 functionality not available on this system 

DMAR: IOMMU enabled是我正在寻找的。

现在,如果机器已经运行好几天而没有重新启动,第一条消息[ 0.000000] DMAR: IOMMU enabled可能不会再出现在使用前一条命令的日志中。

当消息从日志中消失时,是否有任何方法可以检查IOMMU支持?

    自2014以来,iommu在/ sys(sysfs)特殊文件系统中注册为iommu类(记录在ABI / testing / sysfs-class-iommu ): 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); 

    英特尔:

     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行
    • 驱动程序/ iommu / exynos-iommu.c,第623行
    • 驱动程序/ iommu / intel-iommu.c,第4878行
    • drivers / iommu / iommu-sysfs.c,第57行
    • drivers / iommu / msm_iommu.c,第797行
    • 司机/ iommu / mtk_iommu.c,581行