如何为 AMD IOMMU 编译 Gentoo 内核?

如何为 AMD IOMMU 编译 Gentoo 内核?

我有一个 AMD A4-5300 CPU,其主板支持 IOMMU,我尝试在我的 Gentoo Hardened 4.3.3-r4 内核上启用 IOMMU,目的是在 KVM 虚拟机上使用显卡。根据本指南在这里,我应该使用一些提供的选项(“支持 DMA 重新映射设备”、“启用 DMA 重新映射设备”和“PCI 存根驱动程序”)重新编译内核。但是,我的内核配置中缺少“Support for DMA Remapping Devices”和“Enable DMA Remapping Devices”。

然后,我在配置中搜索“重新映射”,并尝试启用多个选项,其中包括 CONFIG_IRQ_REMAP、CONFIG_DMAR_TABLE、CONFIG_IOMMU_SUPPORT、CONFIG_SWIOTLB 和 CONFIG_PCI_IOV。然后,我在启用这些选项的情况下重新编译了内核,amd_iommu=fullflush iommu=force在内核命令行上启动了我的系统,并根据上述指南,我通过在内核消息中查找“AMD-Vi”来检查 IOMMU 是否在我的系统上运行:

dmesg | grep AMD-Vi

我的内核日志中没有显示任何有关 AMD-Vi 的内容。

此外,当我尝试在 virt-manager 上启动带有附加 PCI 设备的虚拟机时,我收到一条消息:“启动域时出错:不支持的配置:主机不支持主机 PCI 设备的直通”

我发现的几乎所有内容都适用于 Fedora、Ubuntu 和 Debian,其中 IOMMU 显然是开箱即用的。我不认为这是我的主板和 CPU 不支持它的问题,因为我的 BIOS 有一个选项,而且因为我记得几年前能够在 Debian 上运行带有 IOMMU 的 VirtualBox VM(尽管我没有)不再跟进,因为我目前从未想过我需要两个显卡才能通过 IOMMU 在 VM 上使用 GPU)。

这是我已经尝试过但没有成功的方法:

  1. 使用标准内核而不是硬化内核。
  2. 启用设备驱动程序 >> IOMMU 硬件支持,AMD IOMMU 支持,使用 DMA 重新映射设备支持 Intel IOMMU,支持中断重新映射总线选项(PCI 等)>> PCI 存根
  3. 使用最新的内核,目前刚刚升级到4.4.8-hardened-r1。

这是我用来启动内核的命令行,为了方便起见,每个参数都位于单独的行上:

root=/dev/ram0 
crypt_root=/dev/disk/by-uuid/c1ce6456-4c6a-4a64-8027-5ec4fdc0f344 
dolvm 
real_root=/dev/mapper/cryptgentoo-raiz 
rootfstype=jfs 
real_init=/sbin/init 
root_keydev=/dev/disk/by-partuuid/086194de-e476-4abb-82da-9744e6fb0257 
root_key=luks-key.gpg 
keymap=la 
amd_iommu=on 
iommu=on

我还缺少内核配置选项吗?


更新:由于心不在焉,我错误地发出了ps -ef | grep -i iommu,看看我刚刚发现了什么......

rockshooter ~ # ps -ef | grep iommu
root        66     2  0 02:57 ?        00:00:00 [amd_iommu_v2]

如果我看到一个内核线程,我想我可能有机会让 IOMMU 运行,只是我的内核没有对此做任何说明。这只是一个疯狂的猜测......但我将继续尝试使用它。

答案1

IOMMU 主要选项

尝试Device Drivers >> IOMMU Hardware Support

IOMMU Options

AMD IOMMU

然后启用AMD IOMMU support.

DMA 重新映射

使能够Support for Intel IOMMU using DMA Remapping Devices

可选:IRQ 重新映射

使能够Support for Interrupt Remapping

可选:启用版本 2 支持

AMD IOMMU Version 2 driver


PCI选项

Bus Options

Bus options (PCI etc.) >> PCI Stub


切勿使用grep配置文件,始终使用menuconfig/键来搜索所需的选项。您链接的指南存在三个问题:

  1. 它是为 Fedora/Redhat 用户量身定制的。
  2. 由于#1,内核版本不同,因此选项位于不同的位置。
  3. Gentoo 的内核比指南中使用的内核新。

更新

我的主板太旧,无法支持 PCI 直通,但我想让您看到这些选项现在已正确启用。使用我指示您使用的确切选项:

IOMMU 主要选项

AGP: Checking aperture...
[    0.000000] AGP: No AGP bridge found
[    0.000000] AGP: Node 0: aperture [bus addr 0xc4000000-0xc5ffffff] (32MB)
[    0.000000] Aperture pointing to e820 RAM. Ignoring.
[    0.000000] AGP: Your BIOS doesn't leave an aperture memory hole
[    0.000000] AGP: Please enable the IOMMU option in the BIOS setup
[    0.000000] AGP: This costs you 64MB of RAM
[    0.000000] AGP: Mapping aperture over RAM [mem 0xc4000000-0xc7ffffff] (65536KB)
...
[    0.959270] PCI-DMA: Disabling AGP.
[    0.959337] PCI-DMA: aperture base @ c4000000 size 65536 KB
[    0.959338] PCI-DMA: using GART IOMMU.
[    0.959340] PCI-DMA: Reserving 64MB of IOMMU area in the AGP aperture
...
[    1.375277] AMD IOMMUv2 driver by Joerg Roedel <[email protected]>
[    1.375277] AMD IOMMUv2 functionality not available on this system

答案2

经过一番哀嚎、抱怨和摇头之后,我终于明白是怎么回事了。

事实证明,IOMMU 一直在工作,只是内核日志没有显示它。ps -ef但 IOMMU 驱动程序在那里,它正在工作,当我错误地输入而不是dmesg这样时,我偶然发现:

rockshooter ~ # ps -ef | grep -i iommu
root        66     2  0 04:19 ?        00:00:00 [amd_iommu_v2]  

当我看到内核线程运行时,我想,也许我的 IOMMU 确实在工作?因此,我执行了与之前在 Debian 上执行的相同配置步骤,一小时后,你瞧,我在连接到显卡的虚拟机上玩一些游戏。

请保存此线程以供将来参考,因为我花了 3 周的时间才弄清楚这一点。我仍然给了另一位发帖者一些当之无愧的 +50 声誉,因为他费尽心思设置和测试这个问题。

相关内容