为什么ioctl命令报告“KVM不支持IOMMU”?

时间:2015-09-09 09:29:11

标签: linux linux-kernel virtualization qemu kvm

我的oClient.UseDefaultCredentials = false; oClient.Credentials = new NetworkCredential("email@gmail.com", "password"); 已使用oMail.To.Add(new MailAddress(txtTo.Text.Trim())); 功能Linux进行编译,我可以确保IOMMU日志:

ON

但执行以下测试代码:

dmesg

输出结果为:

[root@dhb5 vm]# dmesg | grep -e DMAR -e IOMMU
[    0.000000] ACPI: DMAR 000000007bfbb000 00368 (v01 HP     03010201 00000002 HPAG 00020000)
[    0.000000] DMAR: IOMMU enabled
[    0.512361] DMAR: Host address width 44
[    0.516675] DMAR: DRHD base: 0x00000093ff8000 flags: 0x0
[    0.522664] DMAR: IOMMU 0: reg_base_addr 93ff8000 ver 1:0 cap d2078c106f0466 ecap f020de
[    0.531762] DMAR: DRHD base: 0x00000097ff8000 flags: 0x0
[    0.537744] DMAR: IOMMU 1: reg_base_addr 97ff8000 ver 1:0 cap d2078c106f0466 ecap f020de
[    0.546837] DMAR: DRHD base: 0x0000009bff8000 flags: 0x0
[    0.552829] DMAR: IOMMU 2: reg_base_addr 9bff8000 ver 1:0 cap d2078c106f0466 ecap f020de
[    0.561922] DMAR: DRHD base: 0x0000009fff8000 flags: 0x0
[    0.567904] DMAR: IOMMU 3: reg_base_addr 9fff8000 ver 1:0 cap d2078c106f0466 ecap f020de
[    0.576994] DMAR: RMRR base: 0x00000079911000 end: 0x00000079913fff
[    0.584038] DMAR: RMRR base: 0x0000007990e000 end: 0x00000079910fff
[    0.591079] DMAR: ATSR flags: 0x0
[    0.594805] DMAR: ATSR flags: 0x0
[    0.598530] DMAR: ATSR flags: 0x0
[    0.602255] DMAR: ATSR flags: 0x0
[    0.605982] DMAR: RHSA base: 0x00000093ff8000 proximity domain: 0x0
[    0.613024] DMAR: RHSA base: 0x00000097ff8000 proximity domain: 0x1
[    0.620067] DMAR: RHSA base: 0x0000009bff8000 proximity domain: 0x2
[    0.627110] DMAR: RHSA base: 0x0000009fff8000 proximity domain: 0x3
[    0.634163] DMAR-IR: IOAPIC id 13 under DRHD base  0x9fff8000 IOMMU 3
[    0.641411] DMAR-IR: IOAPIC id 11 under DRHD base  0x9bff8000 IOMMU 2
[    0.648647] DMAR-IR: IOAPIC id 12 under DRHD base  0x9bff8000 IOMMU 2
[    0.655887] DMAR-IR: IOAPIC id 10 under DRHD base  0x97ff8000 IOMMU 1
[    0.663126] DMAR-IR: IOAPIC id 8 under DRHD base  0x93ff8000 IOMMU 0
[    0.670264] DMAR-IR: IOAPIC id 9 under DRHD base  0x93ff8000 IOMMU 0
[    0.677404] DMAR-IR: HPET id 0 under DRHD base 0x93ff8000
[    0.683483] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping.
[    0.696950] DMAR-IR: Enabled IRQ remapping in x2apic mode
[    5.505856] DMAR: dmar3: Using Queued invalidation
[    5.511765] DMAR: dmar2: Using Queued invalidation
[    5.517667] DMAR: dmar1: Using Queued invalidation
[    5.523223] DMAR: dmar0: Using Queued invalidation
[    5.528914] DMAR: Setting RMRR:
[    5.532484] DMAR: Setting identity map for device 0000:20:1d.0 [0x7990e000 - 0x79910fff]
[    5.541659] DMAR: Setting identity map for device 0000:00:1d.0 [0x79911000 - 0x79913fff]
[    5.550776] DMAR: Prepare 0-16MiB unity mapping for LPC
[    5.556672] DMAR: Setting identity map for device 0000:00:1f.0 [0x0 - 0xffffff]
[    5.564908] DMAR: PCI-DMA: Intel(R) Virtualization Technology for Directed I/O

我有点困惑,因为从#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/ioctl.h> #include <fcntl.h> #include <unistd.h> #include <linux/kvm.h> #define KVM_FILE "/dev/kvm" int main(void) { int dev; int ret; dev = open(KVM_FILE,O_RDWR|O_NDELAY); ret = ioctl(dev,KVM_CHECK_EXTENSION,KVM_CAP_IOMMU); if(ret != 0) printf("----KVM supports IOMMU (i.e. Intel VT-d or AMD IOMMU).----\n"); else printf("----KVM doesn't support IOMMU (i.e. Intel VT-d or AMD IOMMU).----\n"); return 0; } 日志开始,内核报告它支持----KVM doesn't support IOMMU (i.e. Intel VT-d or AMD IOMMU).---- ,为什么dmesg命令假设IOMMU不支持{{} 1}}?

1 个答案:

答案 0 :(得分:0)

因为您未正确检查ioctl返回值。 man ioctl应该会帮助你。

  

通常,成功时返回零。一些ioctl()请求使用了   返回值作为输出参数并返回非负值   成功。出错时,返回-1,并正确设置errno

如nos所述,在KVM_CHECK_EXTENSION的特定情况下,如果支持上限,ioctl将返回正值,如果不支持则返回0,如果发生错误则返回-1。

所以代码应该是:

if(ret > 0)
    printf("----KVM supports IOMMU (i.e. Intel VT-d or AMD IOMMU).----\n");
else
    printf("----KVM doesn't support IOMMU (i.e. Intel VT-d or AMD IOMMU).----\n");

您将在内核文档(第4.4节)中找到更多详细信息:https://www.kernel.org/doc/Documentation/virtual/kvm/api.txt