From mboxrd@z Thu Jan 1 00:00:00 1970 From: Marcelo Tosatti Subject: Re: [PATCH 1/3] Make kvm_apic_set_irq() deliver all kinds of interrupts. Date: Wed, 4 Mar 2009 14:48:32 -0300 Message-ID: <20090304174832.GA28180@amt.cnet> References: <20090304133004.18081.79398.stgit@dhcp-1-237.tlv.redhat.com> <20090304133010.18081.25499.stgit@dhcp-1-237.tlv.redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: avi@redhat.com, kvm@vger.kernel.org To: Gleb Natapov Return-path: Received: from mx2.redhat.com ([66.187.237.31]:35318 "EHLO mx2.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753897AbZCDRtV (ORCPT ); Wed, 4 Mar 2009 12:49:21 -0500 Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n24HnKHa008027 for ; Wed, 4 Mar 2009 12:49:20 -0500 Content-Disposition: inline In-Reply-To: <20090304133010.18081.25499.stgit@dhcp-1-237.tlv.redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: Hi Gleb, On Wed, Mar 04, 2009 at 03:30:11PM +0200, Gleb Natapov wrote: > Get rid of ioapic_inj_irq() and ioapic_inj_nmi() functions. > > Signed-off-by: Gleb Natapov > --- > > index afc59b2..d58268f 100644 > --- a/arch/x86/kvm/lapic.c > +++ b/arch/x86/kvm/lapic.c > @@ -196,20 +196,30 @@ 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_accept_irq(struct kvm_lapic *apic, int delivery_mode, > + int vector, int level, int trig_mode); > + > +int kvm_apic_set_irq(struct kvm_vcpu *vcpu, u8 vec, u8 dmode, u8 trig) > { > struct kvm_lapic *apic = vcpu->arch.apic; > + int lapic_dmode; > > - 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; > + switch(dmode) { > + case IOAPIC_LOWEST_PRIORITY: > + lapic_dmode = APIC_DM_LOWEST; > + break; > + case IOAPIC_FIXED: > + lapic_dmode = APIC_DM_FIXED; > + break; > + case IOAPIC_NMI: > + lapic_dmode = APIC_DM_NMI; > + break; > + default: > + printk(KERN_DEBUG"Ignoring delivery mode %d\n", dmode); > + return 0; > + break; > } > - return 0; > + return __apic_accept_irq(apic, lapic_dmode, vec, 1, trig); The FIXED/LOWEST handling in __apic_accept_irqs is not as straightforward as the old kvm_apic_set_irq. Perhaps replace 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); kvm_vcpu_kick(vcpu); With the old > - 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); Note they are slightly different. The first version will update APIC_TMR even if the IRR was already set, for trig_mode == 0. Otherwise looks very nice, I've updated Sheng's "KVM: Merge kvm_ioapic_get_delivery_bitmask into kvm_get_intr_delivery_bitmask", so please rebase against that. git://git.kernel.org/pub/scm/linux/kernel/git/marcelo/kvm.git kvm-devel branch, will push in a few minutes.