From: Yang, S. <she...@in...> - 2008-05-08 08:50:19
|
From 650cad44069541fcd9fea8be6a78837e812b3dfd Mon Sep 17 00:00:00 2001 From: Sheng Yang <she...@in...> Date: Thu, 8 May 2008 09:58:50 +0800 Subject: [PATCH 1/4] KVM: LAPIC: Unified the duplicate calling of setting IRR It's strange got two callings of setting IRR seperately for IOAPIC and IPI in lapic. The patch unified them into __apic_set_irq(). Signed-off-by: Sheng Yang <she...@in...> --- arch/x86/kvm/lapic.c | 69 +++++++++++++++++++++++-------------------------- 1 files changed, 32 insertions(+), 37 deletions(-) diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index 7652f88..6226fe0 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -184,20 +184,40 @@ int kvm_lapic_find_highest_irr(struct kvm_vcpu *vcpu) } EXPORT_SYMBOL_GPL(kvm_lapic_find_highest_irr); -int kvm_apic_set_irq(struct kvm_vcpu *vcpu, u8 vec, u8 trig) +static int __apic_set_irq(struct kvm_vcpu *vcpu, u8 vector, u8 trig_mode) { struct kvm_lapic *apic = vcpu->arch.apic; - if (!apic_test_and_set_irr(vec, apic)) { - /* a new pending irq is set in IRR */ - if (trig) - apic_set_vector(vec, apic->regs + APIC_TMR); - else - apic_clear_vector(vec, apic->regs + APIC_TMR); - kvm_vcpu_kick(apic->vcpu); - return 1; + /* FIXME add logic for vcpu on reset */ + if (unlikely(!apic_enabled(apic))) + return 0; + + if (apic_test_and_set_irr(vector, apic)) { + if (trig_mode) + apic_debug("level trig mode repeatedly for vector %d\n", + vector); + return 0; } - return 0; + + if (trig_mode) { + apic_debug("level trig mode for vector %d\n", vector); + apic_set_vector(vector, apic->regs + APIC_TMR); + } else + apic_clear_vector(vector, apic->regs + APIC_TMR); + + if (vcpu->arch.mp_state == KVM_MP_STATE_RUNNABLE) + kvm_vcpu_kick(vcpu); + else if (vcpu->arch.mp_state == KVM_MP_STATE_HALTED) { + vcpu->arch.mp_state = KVM_MP_STATE_RUNNABLE; + if (waitqueue_active(&vcpu->wq)) + wake_up_interruptible(&vcpu->wq); + } + return 1; +} + +int kvm_apic_set_irq(struct kvm_vcpu *vcpu, u8 vec, u8 trig) +{ + return __apic_set_irq(vcpu, vec, trig); } static inline int apic_find_highest_isr(struct kvm_lapic *apic) @@ -315,38 +335,13 @@ static int apic_match_dest(struct kvm_vcpu *vcpu, struct kvm_lapic *source, static int __apic_accept_irq(struct kvm_lapic *apic, int delivery_mode, int vector, int level, int trig_mode) { - int orig_irr, result = 0; + int result = 0; struct kvm_vcpu *vcpu = apic->vcpu; switch (delivery_mode) { case APIC_DM_FIXED: case APIC_DM_LOWEST: - /* FIXME add logic for vcpu on reset */ - if (unlikely(!apic_enabled(apic))) - break; - - orig_irr = apic_test_and_set_irr(vector, apic); - if (orig_irr && trig_mode) { - apic_debug("level trig mode repeatedly for vector %d", - vector); - break; - } - - if (trig_mode) { - apic_debug("level trig mode for vector %d", vector); - apic_set_vector(vector, apic->regs + APIC_TMR); - } else - apic_clear_vector(vector, apic->regs + APIC_TMR); - - if (vcpu->arch.mp_state == KVM_MP_STATE_RUNNABLE) - kvm_vcpu_kick(vcpu); - else if (vcpu->arch.mp_state == KVM_MP_STATE_HALTED) { - vcpu->arch.mp_state = KVM_MP_STATE_RUNNABLE; - if (waitqueue_active(&vcpu->wq)) - wake_up_interruptible(&vcpu->wq); - } - - result = (orig_irr == 0); + result = __apic_set_irq(vcpu, vector, trig_mode); break; case APIC_DM_REMRD: -- 1.5.5 |