Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。












想要改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。

3年前关闭。



Improve this question




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

最佳答案

自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日



在较新的内核中,代码是iommu_device_create(约为4.5的http://elixir.free-electrons.com/linux/v4.5/ident/iommu_device_create)或http://elixir.free-electrons.com/linux/v4.11/ident/iommu_device_sysfs_add(约为referenced in many IOMMU drivers)。

/*
 * 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是ojit_a,因此检查/sys/class/iommu比通过解析iommu_device_sysfs_add输出或在dmesg/var/log/kern.log中搜索特定于驱动程序的启用消息更好(更通用)以编程方式检测已启用的IOMMU:

10-06 14:56