lkml.org 
[lkml]   [2009]   [Jun]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    SubjectRe: [PATCH v4] enable x2APIC without interrupt remapping under KVM
    From
    On Mon, Jun 29, 2009 at 11:45 PM, Gleb Natapov<gleb@redhat.com> 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@redhat.com>
    > 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 linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2009-06-30 09:21    [W:0.048 / U:29.824 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site