检查linux上的IOMMU支持

时间:2017-05-31 13:53:06

标签: linux pci iommu

我想在任何给定的Linux机器上验证是否支持PCI passthrough。经过一段谷歌搜索后,我发现我应该检查是否支持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支持?

1 个答案:

答案 0 :(得分:6)

自2014年启用以来,iommu在/ sys(sysfs)特殊文件系统中注册为类iommu(记录在ABI/testing/sysfs-class-iommu): https://patchwork.kernel.org/patch/4345491/&#34; [2/3] iommu / intel:利用IOMMU sysfs支持&#34; - 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_addreferenced in many IOMMU drivers,因此检查/ sys / class / iommu是以编程方式检测启用的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,line 2163
  •   
  • drivers / iommu / dmar.c,1083行
  •   
  • drivers / iommu / exynos-iommu.c,第623行
  •   
  • drivers / iommu / intel-iommu.c,line 4878
  •   
  • drivers / iommu / iommu-sysfs.c,第57行
  •   
  • drivers / iommu / msm_iommu.c,第797行
  •   
  • drivers / iommu / mtk_iommu.c,第581行
  •