I'd like to verify on any given Linux machine if PCI passthrough is supported. After a bit of googling, I found that I should rather check if IOMMU is supported, and I did so by running:
dmesg | grep IOMMU
If it supports IOMMU (and not IOMMUv2), I would get:
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
...where DMAR: IOMMU enabled
is what I'm looking for.
Now, if the machine has been running for days without a reboot, that first message [ 0.000000] DMAR: IOMMU enabled
might not appear any more in the log with the previous command.
Is there any way to check for IOMMU support when that message disappears from the log?
You should do ls (readdir) of its subfolders: ls -l /sys/class/iommu/* , or event ls -l /sys/class/iommu/*/devices to find devices which have iommu enabled. will DMAR present in AMD also?
The easiest way to find this is to look in dmesg for DMAR entries. If you don't see errors, then VT-d is enabled. Either way, you're looking for that last line, DMAR-IR: Enabled IRQ remapping in <whichever> mode . On a system with VT-d disabled, you will either see an error message, or nothing at all.
Enable IOMMU by editing the grub configuration file. If you are using IBM POWER8 hardware, skip this step as IOMMU is enabled by default. For Intel, boot the machine, and append intel_iommu=on to the end of the GRUB_CMDLINE_LINUX line in the grub configuration file.
This is the virtualization technology that everyone knows. In the Asus UEFI BIOS, this feature is in "Advanced -> CPU configuration" and is called SVM (Secure Virtual Machine), or AMD-V or AMD Virtualization. Then, if your motherboard supports it, you will find the IOMMU option in : Advanced -> North Bridge.
Since 2014 enabled iommu are registered in /sys (sysfs) special file system as class iommu
(documented at ABI/testing/sysfs-class-iommu):
https://patchwork.kernel.org/patch/4345491/ "[2/3] iommu/intel: Make use of IOMMU sysfs support" - June 12, 2014
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
The code is 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) in more recent kernels.
/*
* 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, ...)
Registration is done only for enabled 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);
With 4.11 linux kernel version iommu_device_sysfs_add
is referenced in many IOMMU drivers, so checking /sys/class/iommu is better (more universal) way to programmatically detect enabled IOMMU than parsing dmesg
output or searching in /var/log/kern.log
or /var/log/messages
for driver-specific enable 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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With