PCIパススルーがサポートされているかどうか、特定のLinuxマシンで確認したいと思います。少しグーグルで調べた後、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はクラスiommu
として/ sys(sysfs)特殊ファイルシステムに登録されています( ABI/testing/sysfs-class-iomm で文書化されています): 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_create
( http://elixir.free-electrons.com/linux/v4.5/ident/iommu_device_create 、約4.5)または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);
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);
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
- drivers/iommu/exynos-iommu.c、623行目
- drivers/iommu/intel-iommu.c、行4878
- drivers/iommu/iommu-sysfs.c、57行目
- drivers/iommu/msm_iommu.c、行797
- drivers/iommu/mtk_iommu.c、ライン581