Linux kernel 内核错误:IRQ重新映射不支持X2APIC模式,已禁用X2APIC

Linux kernel 内核错误:IRQ重新映射不支持X2APIC模式,已禁用X2APIC,linux-kernel,Linux Kernel,我需要在IntelR XeonR CPU E3-1225 v5@3.30GHz上启用x2apic,我发现cpuinfo中支持x2apic: 但当内核启动时,我发现错误消息: [0.138328]IRQ重新映射不支持X2APIC模式,请禁用X2APIC 我已经检查了我的内核配置: CONFIG_X86_X2APIC=y 如何解决此问题?x2apic in/proc/cpuinfo显示了CPU芯片的功能。 当存在无法为所需模式启用X2APIC模式的环境时,内核函数将生成消息IRQ remapping

我需要在IntelR XeonR CPU E3-1225 v5@3.30GHz上启用x2apic,我发现cpuinfo中支持x2apic:

但当内核启动时,我发现错误消息:

[0.138328]IRQ重新映射不支持X2APIC模式,请禁用X2APIC

我已经检查了我的内核配置:

CONFIG_X86_X2APIC=y


如何解决此问题?

x2apic in/proc/cpuinfo显示了CPU芯片的功能。 当存在无法为所需模式启用X2APIC模式的环境时,内核函数将生成消息IRQ remapping NOT support X2APIC mode,disable X2APIC。当前代码为

static __init void try_to_enable_x2apic(int remap_mode)
{
    if (x2apic_state == X2APIC_DISABLED)
        return;

    if (remap_mode != IRQ_REMAP_X2APIC_MODE) {
        /* IR is required if there is APIC ID > 255 even when running
         * under KVM
         */
        if (max_physical_apicid > 255 ||
            !x86_init.hyper.x2apic_available()) {
            pr_info("x2apic: IRQ remapping doesn't support X2APIC mode\n");
            x2apic_disable();
            return;
        }

        /*
         * without IR all CPUs can be addressed by IOAPIC/MSI
         * only in physical mode
         */
        x2apic_phys = 1;
    }
    x2apic_enable();
}
它是从arch/x86/kernel/apic/apic.c文件的

    ir_stat = irq_remapping_prepare();
    if (ir_stat < 0 && !x2apic_supported())
        return;
...

    /* If irq_remapping_prepare() succeeded, try to enable it */
    if (ir_stat >= 0)
        ir_stat = irq_remapping_enable();
    /* ir_stat contains the remap mode or an error code */
    try_to_enable_x2apic(ir_stat);
2015年和2015年有一些补丁在运行;2013年引入代码路径时,有大量邮件列表

x86/apic:仅在必要时禁用CPU x2apic模式

当中断重新映射硬件不处于X2APIC时,CPU X2APIC模式 将在以下情况下禁用:

1最大CPU APIC ID大于255 2 hypervisio不支持x2apic模式。
您应该检查您的虚拟机监控程序(如果使用)和irq重新映射方法。可以在“英特尔启用IRQ重新映射”的pr_信息消息中启用IRQ重新映射-

x2apic in/proc/cpuinfo显示CPU芯片的功能。 当存在无法为所需模式启用X2APIC模式的环境时,内核函数将生成消息IRQ remapping NOT support X2APIC mode,disable X2APIC。当前代码为

static __init void try_to_enable_x2apic(int remap_mode)
{
    if (x2apic_state == X2APIC_DISABLED)
        return;

    if (remap_mode != IRQ_REMAP_X2APIC_MODE) {
        /* IR is required if there is APIC ID > 255 even when running
         * under KVM
         */
        if (max_physical_apicid > 255 ||
            !x86_init.hyper.x2apic_available()) {
            pr_info("x2apic: IRQ remapping doesn't support X2APIC mode\n");
            x2apic_disable();
            return;
        }

        /*
         * without IR all CPUs can be addressed by IOAPIC/MSI
         * only in physical mode
         */
        x2apic_phys = 1;
    }
    x2apic_enable();
}
它是从arch/x86/kernel/apic/apic.c文件的

    ir_stat = irq_remapping_prepare();
    if (ir_stat < 0 && !x2apic_supported())
        return;
...

    /* If irq_remapping_prepare() succeeded, try to enable it */
    if (ir_stat >= 0)
        ir_stat = irq_remapping_enable();
    /* ir_stat contains the remap mode or an error code */
    try_to_enable_x2apic(ir_stat);
2015年和2015年有一些补丁在运行;2013年引入代码路径时,有大量邮件列表

x86/apic:仅在必要时禁用CPU x2apic模式

当中断重新映射硬件不处于X2APIC时,CPU X2APIC模式 将在以下情况下禁用:

1最大CPU APIC ID大于255 2 hypervisio不支持x2apic模式。
您应该检查您的虚拟机监控程序(如果使用)和irq重新映射方法。“英特尔启用IRQ重新映射”-

个人认为此错误消息具有误导性

说明:IRQ重新映射不支持X2APIC模式,请禁用X2APIC

它的实际含义是:IRQ重新映射未启用,因此x2APIC已禁用

解决方案是打开IRQ重新映射。在内核配置中设置CONFIG_IRQ_REMAP=y并重新编译它

x2APIC要求启用IOMMU并启用IRQ重新映射

在BIOS中启用IOMMU。默认情况下,许多系统都会禁用它。即使在我的全新2020年7月版上,千兆字节R282-Z93和EPYC 7742 CPU也是如此! 在BIOS中启用x2APIC。 在内核中启用IOMMU支持: 对于英特尔CPU:CONFIG_Intel_IOMMU=y 对于AMD CPU:CONFIG_AMD_IOMMU=y和CONFIG_AMD_IOMMU V2=y 在内核中启用x2APIC支持:CONFIG_X86_x2APIC=y 在内核中启用IRQ重新映射:CONFIG_IRQ_REMAP=y 那么,如果x2APIC需要IRQ重新映射,那么如何最终得到一个支持x2APIC但没有IRQ重新映射的内核呢?好的,如果您查看CONFIG_X86_X2APIC的依赖项,您会发现它需要X86_LOCAL_APIC&&X86_64&&IRQ_REMAP|HYPERVISOR|GUEST


因此,如果内核构建为支持在虚拟机监控程序下运行,那么很可能无法启用IRQ重新映射选项。我就是这么做的。哎呀!在我将内核源代码重新映射为IRQ之前,找出问题所在是非常令人困惑的,因为IRQ重新映射不支持X2APIC模式,禁用X2APIC消息,在这一点上,解决问题变得相对简单。

我个人认为此错误消息具有误导性

说明:IRQ重新映射不支持X2APIC模式,请禁用X2APIC

它的实际含义是:IRQ重新映射未启用,因此x2APIC已禁用

解决方案是打开IRQ重新映射。在内核配置中设置CONFIG_IRQ_REMAP=y并重新编译它

x2APIC要求启用IOMMU并启用IRQ重新映射

在BIOS中启用IOMMU。默认情况下,许多系统都会禁用它。即使在我的全新2020年7月版上,千兆字节R282-Z93和EPYC 7742 CPU也是如此! 在BIOS中启用x2APIC。 在内核中启用IOMMU支持: 对于英特尔CPU:CONFIG_Intel_IOMMU=y 对于AMD CPU:CONFIG_AMD_IOMMU=y和CONFIG_AMD_IOMMU V2=y 在内核中启用x2APIC支持:CONFIG_X86_x2APIC=y 在内核中启用IRQ重新映射:CONFIG_IRQ_REMAP=y 那么,如果x2APIC需要IRQ重新映射,那么如何最终得到一个支持x2APIC但没有IRQ重新映射的内核呢?好的,如果您查看CONFIG_X86_X2APIC的依赖项,您会发现它需要X86_LOCAL_APIC&&X86_64&&IRQ_REMAP|HYPERVISOR|GUEST

因此,如果内核构建为支持在虚拟机监控程序下运行,那么很可能无法启用
IRQ重映射。我就是这么做的。哎呀!在我为IRQ重新映射的内核源代码进行灰色映射之前,找出错误是非常混乱的,因为IRQ重新映射不支持X2APIC模式,禁用X2APIC消息,在这一点上,解决问题变得相对简单。

我从这里运行配置[1],没有发现问题。您确定BIOS允许您这样做吗?[1] :我从这里运行配置[1],没有发现问题。您确定BIOS允许您这样做吗?[1]: