Gleb Natapov wrote on 2012-12-10:
> According to Intel SDM Volume 3 Section 10.8.1 "Interrupt Handling with
> the Pentium 4 and Intel Xeon Processors" and Section 10.8.2 "Interrupt
> Handling with the P6 Family and Pentium Processors" ExtINT interrupts are
> sent directly to the processor core for handling. Currently KVM checks
> APIC before it considers ExtINT interrupts for injection which is
> backwards from the spec. Make code behave according to the SDM.
Ack.

> Signed-off-by: Gleb Natapov <[email protected]>
> diff --git a/arch/x86/kvm/i8259.c b/arch/x86/kvm/i8259.c
> index 848206d..cc31f7c 100644
> --- a/arch/x86/kvm/i8259.c
> +++ b/arch/x86/kvm/i8259.c
> @@ -241,6 +241,8 @@ int kvm_pic_read_irq(struct kvm *kvm)
>       int irq, irq2, intno;
>       struct kvm_pic *s = pic_irqchip(kvm);
> +     s->output = 0;
> +
>       pic_lock(s);
>       irq = pic_get_irq(&s->pics[0]);
>       if (irq >= 0) {
> diff --git a/arch/x86/kvm/irq.c b/arch/x86/kvm/irq.c
> index 7e06ba1..ebd98d0 100644
> --- a/arch/x86/kvm/irq.c
> +++ b/arch/x86/kvm/irq.c
> @@ -48,14 +48,10 @@ int kvm_cpu_has_interrupt(struct kvm_vcpu *v)
>       if (!irqchip_in_kernel(v->kvm))
>               return v->arch.interrupt.pending;
> -     if (kvm_apic_has_interrupt(v) == -1) {  /* LAPIC */
> -             if (kvm_apic_accept_pic_intr(v)) {
> -                     s = pic_irqchip(v->kvm);        /* PIC */
> -                     return s->output;
> -             } else
> -                     return 0;
> -     }
> -     return 1;
> +     if (kvm_apic_accept_pic_intr(v) && pic_irqchip(v->kvm)->output)
> +             return pic_irqchip(v->kvm)->output;     /* PIC */
> +
> +     return kvm_apic_has_interrupt(v) != -1; /* LAPIC */
>  }
>  EXPORT_SYMBOL_GPL(kvm_cpu_has_interrupt);
> @@ -65,20 +61,14 @@ EXPORT_SYMBOL_GPL(kvm_cpu_has_interrupt);
>  int kvm_cpu_get_interrupt(struct kvm_vcpu *v)
>  {
>       struct kvm_pic *s;
> -     int vector;
> 
>       if (!irqchip_in_kernel(v->kvm))
>               return v->arch.interrupt.nr;
> -     vector = kvm_get_apic_interrupt(v);     /* APIC */
> -     if (vector == -1) {
> -             if (kvm_apic_accept_pic_intr(v)) {
> -                     s = pic_irqchip(v->kvm);
> -                     s->output = 0;          /* PIC */
> -                     vector = kvm_pic_read_irq(v->kvm);
> -             }
> -     }
> -     return vector;
> +     if (kvm_apic_accept_pic_intr(v) && pic_irqchip(v->kvm)->output)
> +             return kvm_pic_read_irq(v->kvm);        /* PIC */
> +
> +     return kvm_get_apic_interrupt(v);       /* APIC */
>  }
>  EXPORT_SYMBOL_GPL(kvm_cpu_get_interrupt);
> --
>                       Gleb.


Best regards,
Yang


--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to