X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=drivers%2Fkvm%2Firq.c;h=7628c7ff628ff1db90f3a9a4d20df792bb59f4ad;hb=444ad82bc3eaa554be40d22dc248e58aeefd54d9;hp=0b4430a0cae078fea81910db40f207a6cf0f757c;hpb=97222cc8316328965851ed28d23f6b64b4c912d2;p=linux-2.6 diff --git a/drivers/kvm/irq.c b/drivers/kvm/irq.c index 0b4430a0ca..7628c7ff62 100644 --- a/drivers/kvm/irq.c +++ b/drivers/kvm/irq.c @@ -33,8 +33,11 @@ int kvm_cpu_has_interrupt(struct kvm_vcpu *v) struct kvm_pic *s; if (kvm_apic_has_interrupt(v) == -1) { /* LAPIC */ - s = pic_irqchip(v->kvm); /* PIC */ - return s->output; + if (kvm_apic_accept_pic_intr(v)) { + s = pic_irqchip(v->kvm); /* PIC */ + return s->output; + } else + return 0; } return 1; } @@ -50,9 +53,11 @@ int kvm_cpu_get_interrupt(struct kvm_vcpu *v) vector = kvm_get_apic_interrupt(v); /* APIC */ if (vector == -1) { - s = pic_irqchip(v->kvm); - s->output = 0; /* PIC */ - vector = kvm_pic_read_irq(s); + if (kvm_apic_accept_pic_intr(v)) { + s = pic_irqchip(v->kvm); + s->output = 0; /* PIC */ + vector = kvm_pic_read_irq(s); + } } return vector; } @@ -70,11 +75,24 @@ void kvm_vcpu_kick(struct kvm_vcpu *vcpu) { int ipi_pcpu = vcpu->cpu; + if (waitqueue_active(&vcpu->wq)) { + wake_up_interruptible(&vcpu->wq); + ++vcpu->stat.halt_wakeup; + } if (vcpu->guest_mode) smp_call_function_single(ipi_pcpu, vcpu_kick_intr, vcpu, 0, 0); } -void kvm_ioapic_update_eoi(struct kvm *kvm, int vector) +void kvm_inject_pending_timer_irqs(struct kvm_vcpu *vcpu) +{ + kvm_inject_apic_timer_irqs(vcpu); + /* TODO: PIT, RTC etc. */ +} +EXPORT_SYMBOL_GPL(kvm_inject_pending_timer_irqs); + +void kvm_timer_intr_post(struct kvm_vcpu *vcpu, int vec) { - /* TODO: for kernel IOAPIC */ + kvm_apic_timer_intr_post(vcpu, vec); + /* TODO: PIT, RTC etc. */ } +EXPORT_SYMBOL_GPL(kvm_timer_intr_post);