On Mon, Jun 29, 2009 at 11:45 PM, Gleb Natapov<gleb@xxxxxxxxxx> wrote: > KVM would like to provide x2APIC interface to a guest without emulating > interrupt remapping device. The reason KVM prefers guest to use x2APIC > is that x2APIC interface is better virtualizable and provides better > performance than mmio xAPIC interface: > > - msr exits are faster than mmio (no page table walk, emulation) > - no need to read back ICR to look at the busy bit > - one 64 bit ICR write instead of two 32 bit writes > - shared code with the Hyper-V paravirt interface > > Included patch changes x2APIC enabling logic to enable it even if IR > initialization failed, but kernel runs under KVM and no apic id is > greater than 255 (if there is one spec requires BIOS to move to x2apic > mode before starting an OS). > > Signed-off-by: Gleb Natapov <gleb@xxxxxxxxxx> > diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c > index 8c7c042..351d55a 100644 > --- a/arch/x86/kernel/apic/apic.c > +++ b/arch/x86/kernel/apic/apic.c > @@ -49,6 +49,7 @@ > #include <asm/mtrr.h> > #include <asm/smp.h> > #include <asm/mce.h> > +#include <asm/kvm_para.h> > > unsigned int num_processors; > > @@ -1363,52 +1364,75 @@ void enable_x2apic(void) > } > #endif /* CONFIG_X86_X2APIC */ > > -void __init enable_IR_x2apic(void) > +int __init enable_IR(void) > { > #ifdef CONFIG_INTR_REMAP > int ret; > - unsigned long flags; > - struct IO_APIC_route_entry **ioapic_entries = NULL; > > ret = dmar_table_init(); > if (ret) { > pr_debug("dmar_table_init() failed with %d:\n", ret); > - goto ir_failed; > + return 0; > } > > if (!intr_remapping_supported()) { > pr_debug("intr-remapping not supported\n"); > - goto ir_failed; > + return 0; > } > > - > if (!x2apic_preenabled && skip_ioapic_setup) { > pr_info("Skipped enabling intr-remap because of skipping " > "io-apic setup\n"); > - return; > + return 0; > } > > + if (enable_intr_remapping(x2apic_supported())) > + return 0; > + > + pr_info("Enabled Interrupt-remapping\n"); > + > + return 1; > + > +#endif > + return 0; > +} > + > +void __init enable_IR_x2apic(void) > +{ > + unsigned long flags; > + struct IO_APIC_route_entry **ioapic_entries = NULL; > + int ret, x2apic_enabled = 0; > + > ioapic_entries = alloc_ioapic_entries(); > if (!ioapic_entries) { > - pr_info("Allocate ioapic_entries failed: %d\n", ret); > - goto end; > + pr_info("Allocate ioapic_entries failed\n"); > + goto out; > } > > ret = save_IO_APIC_setup(ioapic_entries); > if (ret) { > pr_info("Saving IO-APIC state failed: %d\n", ret); > - goto end; > + goto out; > } > > local_irq_save(flags); > - mask_IO_APIC_setup(ioapic_entries); > mask_8259A(); > + mask_IO_APIC_setup(ioapic_entries); > > - ret = enable_intr_remapping(x2apic_supported()); > - if (ret) > - goto end_restore; > + ret = enable_IR(); > + if (!ret) { > + /* IR is required if x2apic is enabled by BIOS even > + * when running in kvm since this indicates present > + * of APIC ID > 255 */ > + if (x2apic_preenabled || !kvm_para_available()) > + goto nox2apic; > + else > + /* without IR all CPUs can be addressed by IOAPIC/MSI > + * only in physical mode */ > + x2apic_phys = 1; > + } how about kexec second kernel in KVM ? x2apic_preenabled will be set in second kernel. YH -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html