在 linux 上检查 IOMMU 支持
check for IOMMU support on linux
我想在任何给定的 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 <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) 特殊文件系统中注册为 class iommu
(记录在 ABI/testing/sysfs-class-iommu):
https://patchwork.kernel.org/patch/4345491/“[2/3]iommu/intel:利用 IOMMU sysfs 支持”- 2014 年 6 月 12 日
Register our DRHD IOMMUs, cross link devices, and provide a base set
of attributes for the IOMMU. ...
On a typical desktop system, this provides the following (pruned):
$ find /sys | grep dmar
/sys/devices/virtual/iommu/dmar0
...
/sys/class/iommu/dmar0
/sys/class/iommu/dmar1
代码在最近的内核中是 iommu_device_create
(http://elixir.free-electrons.com/linux/v4.5/ident/iommu_device_create, around 4.5) or iommu_device_sysfs_add
(http://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
是 referenced in many IOMMU drivers,因此检查 /sys/class/iommu 以编程方式检测启用的 IOMMU 比解析 [=19] 更好(更通用) =] 在 /var/log/kern.log
或 /var/log/messages
中输出或搜索特定于驱动程序的启用消息:
Referenced in 10 files:
- drivers/iommu/amd_iommu_init.c, line 1640
- drivers/iommu/arm-smmu-v3.c, line 2709
- drivers/iommu/arm-smmu.c, line 2163
- drivers/iommu/dmar.c, line 1083
- drivers/iommu/exynos-iommu.c, line 623
- drivers/iommu/intel-iommu.c, line 4878
- drivers/iommu/iommu-sysfs.c, line 57
- drivers/iommu/msm_iommu.c, line 797
- drivers/iommu/mtk_iommu.c, line 581
我想在任何给定的 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 <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) 特殊文件系统中注册为 class iommu
(记录在 ABI/testing/sysfs-class-iommu):
https://patchwork.kernel.org/patch/4345491/“[2/3]iommu/intel:利用 IOMMU sysfs 支持”- 2014 年 6 月 12 日
Register our DRHD IOMMUs, cross link devices, and provide a base set of attributes for the IOMMU. ... On a typical desktop system, this provides the following (pruned):
$ find /sys | grep dmar /sys/devices/virtual/iommu/dmar0 ... /sys/class/iommu/dmar0 /sys/class/iommu/dmar1
代码在最近的内核中是 iommu_device_create
(http://elixir.free-electrons.com/linux/v4.5/ident/iommu_device_create, around 4.5) or iommu_device_sysfs_add
(http://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
是 referenced in many IOMMU drivers,因此检查 /sys/class/iommu 以编程方式检测启用的 IOMMU 比解析 [=19] 更好(更通用) =] 在 /var/log/kern.log
或 /var/log/messages
中输出或搜索特定于驱动程序的启用消息:
Referenced in 10 files:
- drivers/iommu/amd_iommu_init.c, line 1640
- drivers/iommu/arm-smmu-v3.c, line 2709
- drivers/iommu/arm-smmu.c, line 2163
- drivers/iommu/dmar.c, line 1083
- drivers/iommu/exynos-iommu.c, line 623
- drivers/iommu/intel-iommu.c, line 4878
- drivers/iommu/iommu-sysfs.c, line 57
- drivers/iommu/msm_iommu.c, line 797
- drivers/iommu/mtk_iommu.c, line 581