On Wed, 2008-07-16 at 18:04 +0300, Avi Kivity wrote:
> Ben-Ami Yassour wrote:
> > +/* Stores information for identifying host PCI devices assigned to the
> > + * guest: this is used in the host kernel and in the userspace.
> > + */
> > +struct kvm_pci_pt_info {
> > +   unsigned char busnr;
> > +   unsigned int devfn;
> > +   __u32 irq;
> > +};
> >   
> 
> Badly aligned.  Please use __u32 for all fields, and add a __u32 padding 
> field at the end so we have the same ABI for i386 and x86_64.
> 
> Some pci devices support more than one irq.  Should we make irq an 
> array?  Alternatively, decouple irq assignment from pci information
> and 
> let userspace handle everything.  This lets us assign non-pci devices 
> (like serial ports, etc.).
Can we limit the first version to single irq devices, and handle this
after the merge?

> >   * ioctls for vcpu fds
> > diff --git a/virt/kvm/ioapic.c b/virt/kvm/ioapic.c
> > index 8ce93c7..0b5bc40 100644
> > --- a/virt/kvm/ioapic.c
> > +++ b/virt/kvm/ioapic.c
> > @@ -288,13 +288,22 @@ void kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, 
> > int irq, int level)
> >  static void __kvm_ioapic_update_eoi(struct kvm_ioapic *ioapic, int gsi)
> >  {
> >     union ioapic_redir_entry *ent;
> > +   struct kvm_pci_pt_dev_list *match;
> > +   unsigned long flags;
> >  
> >     ent = &ioapic->redirtbl[gsi];
> >     ASSERT(ent->fields.trig_mode == IOAPIC_LEVEL_TRIG);
> >  
> >     ent->fields.remote_irr = 0;
> > -   if (!ent->fields.mask && (ioapic->irr & (1 << gsi)))
> > -           ioapic_service(ioapic, gsi);
> > +
> > +   read_lock_irqsave(&kvm_pci_pt_lock, flags);
> > +   match = kvm_find_pci_pt_dev(&ioapic->kvm->arch.pci_pt_dev_head, NULL,
> > +                               gsi, KVM_PT_SOURCE_IRQ_ACK);
> > +   read_unlock_irqrestore(&kvm_pci_pt_lock, flags);
> > +   if (!match) {
> > +           if (!ent->fields.mask && (ioapic->irr & (1 << gsi)))
> > +                   ioapic_service(ioapic, gsi);
> > +   }
> >   
> 
> What's device assignment code doing in the ioapic?  This should be done 
> through the notifier (if it needs to return a value, great).
> 

This purpose of this code is to avoid the call to ioapic_service for
assigned devices, because it is not required and causes a double
injection of the interrupt.

Can you please explain why as part of eoi we inject a new interrupt?

Thanks,
Ben

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