RE: [PATCH] KVM: inject ExtINT interrupt before APIC interrupts

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 <gleb@xxxxxxxxxx>
> 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 majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux