On Wednesday 06 May 2009 13:55:44 Sheng Yang wrote:
> On Tuesday 05 May 2009 16:14:29 Gleb Natapov wrote:
> > Only one interrupt vector can be injected from userspace irqchip at
> > any given time so no need to store it in a bitmap. Put it into interrupt
> > queue directly.
> >
> > Signed-off-by: Gleb Natapov <[email protected]>
> > ---
> >  arch/x86/include/asm/kvm_host.h |    2 --
> >  arch/x86/kvm/irq.c              |    4 ++--
> >  arch/x86/kvm/x86.c              |   38
> > +++++++++++--------------------------- arch/x86/kvm/x86.h              |
> > 12 ------------
> >  4 files changed, 13 insertions(+), 43 deletions(-)
> >
> > diff --git a/arch/x86/include/asm/kvm_host.h
> > b/arch/x86/include/asm/kvm_host.h index 8e680c3..cc892f5 100644
> > --- a/arch/x86/include/asm/kvm_host.h
> > +++ b/arch/x86/include/asm/kvm_host.h
> > @@ -266,8 +266,6 @@ struct kvm_mmu {
> >
> >  struct kvm_vcpu_arch {
> >     u64 host_tsc;
> > -   unsigned long irq_summary; /* bit vector: 1 per word in irq_pending */
> > -   DECLARE_BITMAP(irq_pending, KVM_NR_INTERRUPTS);
> >     /*
> >      * rip and regs accesses must go through
> >      * kvm_{register,rip}_{read,write} functions.
> > diff --git a/arch/x86/kvm/irq.c b/arch/x86/kvm/irq.c
> > index 11c2757..96dfbb6 100644
> > --- a/arch/x86/kvm/irq.c
> > +++ b/arch/x86/kvm/irq.c
> > @@ -50,7 +50,7 @@ int kvm_cpu_has_interrupt(struct kvm_vcpu *v)
> >     struct kvm_pic *s;
> >
> >     if (!irqchip_in_kernel(v->kvm))
> > -           return v->arch.irq_summary;
> > +           return v->arch.interrupt.pending;
> >
> >     if (kvm_apic_has_interrupt(v) == -1) {  /* LAPIC */
> >             if (kvm_apic_accept_pic_intr(v)) {
> > @@ -72,7 +72,7 @@ int kvm_cpu_get_interrupt(struct kvm_vcpu *v)
> >     int vector;
> >
> >     if (!irqchip_in_kernel(v->kvm))
> > -           return kvm_pop_irq(v);
> > +           return v->arch.interrupt.nr;
> >
> >     vector = kvm_get_apic_interrupt(v);     /* APIC */
> >     if (vector == -1) {
> > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> > index 12ab1cc..4596927 100644
> > --- a/arch/x86/kvm/x86.c
> > +++ b/arch/x86/kvm/x86.c
> > @@ -1424,8 +1424,7 @@ static int kvm_vcpu_ioctl_interrupt(struct kvm_vcpu
> > *vcpu, return -ENXIO;
> >     vcpu_load(vcpu);
> >
> > -   set_bit(irq->irq, vcpu->arch.irq_pending);
> > -   set_bit(irq->irq / BITS_PER_LONG, &vcpu->arch.irq_summary);
> > +   kvm_queue_interrupt(vcpu, irq->irq);
> >
> >     vcpu_put(vcpu);
> >
> > @@ -3562,12 +3561,7 @@ int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu
> > *vcpu, sregs->efer = vcpu->arch.shadow_efer;
> >     sregs->apic_base = kvm_get_apic_base(vcpu);
> >
> > -   if (irqchip_in_kernel(vcpu->kvm))
> > -           memset(sregs->interrupt_bitmap, 0,
> > -                  sizeof sregs->interrupt_bitmap);
>
> ? When did we discard the saving of pending interrupt for
> irqchip_in_kernel?

Oh, sorry. Please ignore this.

Finally found I missed the latest update. :(

-- 
regards
Yang, Sheng

>
> > -   else
> > -           memcpy(sregs->interrupt_bitmap, vcpu->arch.irq_pending,
> > -                  sizeof sregs->interrupt_bitmap);
> > +   memset(sregs->interrupt_bitmap, 0, sizeof sregs->interrupt_bitmap);
>
> No need to save any pending interrupts? Did I miss anything?
>
> >     if (vcpu->arch.interrupt.pending)
> >             set_bit(vcpu->arch.interrupt.nr,
> > @@ -4037,7 +4031,7 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu
> > *vcpu, struct kvm_sregs *sregs)
> >  {
> >     int mmu_reset_needed = 0;
> > -   int i, pending_vec, max_bits;
> > +   int pending_vec, max_bits;
> >     struct descriptor_table dt;
> >
> >     vcpu_load(vcpu);
> > @@ -4079,24 +4073,14 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu
> > *vcpu, if (mmu_reset_needed)
> >             kvm_mmu_reset_context(vcpu);
> >
> > -   if (!irqchip_in_kernel(vcpu->kvm)) {
> > -           memcpy(vcpu->arch.irq_pending, sregs->interrupt_bitmap,
> > -                  sizeof vcpu->arch.irq_pending);
> > -           vcpu->arch.irq_summary = 0;
> > -           for (i = 0; i < ARRAY_SIZE(vcpu->arch.irq_pending); ++i)
> > -                   if (vcpu->arch.irq_pending[i])
> > -                           __set_bit(i, &vcpu->arch.irq_summary);
> > -   } else {
> > -           max_bits = (sizeof sregs->interrupt_bitmap) << 3;
> > -           pending_vec = find_first_bit(
> > -                   (const unsigned long *)sregs->interrupt_bitmap,
> > -                   max_bits);
> > -           /* Only pending external irq is handled here */
> > -           if (pending_vec < max_bits) {
> > -                   kvm_queue_interrupt(vcpu, pending_vec);
> > -                   pr_debug("Set back pending irq %d\n", pending_vec);
> > -           }
> > -           kvm_pic_clear_isr_ack(vcpu->kvm);
> > +   max_bits = (sizeof sregs->interrupt_bitmap) << 3;
>
> If interrupt_bitmap is always zero as above, why we got this... For
> compatible?


--
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