> From: Jan Kiszka > Sent: Tuesday, September 13, 2011 12:58 AM > > The threaded IRQ handler for MSI-X has almost nothing in common with the > INTx/MSI handler. Move its code into a dedicated handler. if it's desired to further go down this cleanup path, there's also no need to register ack notifier for MSI-X type device since all the logic there is simply a nop: static void kvm_assigned_dev_ack_irq(struct kvm_irq_ack_notifier *kian) { struct kvm_assigned_dev_kernel *dev; if (kian->gsi == -1) return; dev = container_of(kian, struct kvm_assigned_dev_kernel, ack_notifier); kvm_set_irq(dev->kvm, dev->irq_source_id, dev->guest_irq, 0); /* The guest irq may be shared so this ack may be * from another device. */ spin_lock(&dev->intx_lock); if (dev->host_irq_disabled) { enable_irq(dev->host_irq); dev->host_irq_disabled = false; } spin_unlock(&dev->intx_lock); } Thanks Kevin > > Signed-off-by: Jan Kiszka <jan.kiszka@xxxxxxxxxxx> > --- > virt/kvm/assigned-dev.c | 32 +++++++++++++++++++------------- > 1 files changed, 19 insertions(+), 13 deletions(-) > > diff --git a/virt/kvm/assigned-dev.c b/virt/kvm/assigned-dev.c > index 84ead54..7debe8c 100644 > --- a/virt/kvm/assigned-dev.c > +++ b/virt/kvm/assigned-dev.c > @@ -58,8 +58,6 @@ static int find_index_from_host_irq(struct > kvm_assigned_dev_kernel > static irqreturn_t kvm_assigned_dev_thread(int irq, void *dev_id) > { > struct kvm_assigned_dev_kernel *assigned_dev = dev_id; > - u32 vector; > - int index; > > if (assigned_dev->irq_requested_type & KVM_DEV_IRQ_HOST_INTX) { > spin_lock(&assigned_dev->intx_lock); > @@ -68,20 +66,28 @@ static irqreturn_t kvm_assigned_dev_thread(int irq, > void *dev_id) > spin_unlock(&assigned_dev->intx_lock); > } > > - if (assigned_dev->irq_requested_type & KVM_DEV_IRQ_HOST_MSIX) { > - index = find_index_from_host_irq(assigned_dev, irq); > - if (index >= 0) { > - vector = assigned_dev-> > - guest_msix_entries[index].vector; > - kvm_set_irq(assigned_dev->kvm, > - assigned_dev->irq_source_id, vector, 1); > - } > - } else > + kvm_set_irq(assigned_dev->kvm, assigned_dev->irq_source_id, > + assigned_dev->guest_irq, 1); > + > + return IRQ_HANDLED; > +} > + > +#ifdef __KVM_HAVE_MSIX > +static irqreturn_t kvm_assigned_dev_thread_msix(int irq, void *dev_id) > +{ > + struct kvm_assigned_dev_kernel *assigned_dev = dev_id; > + int index = find_index_from_host_irq(assigned_dev, irq); > + u32 vector; > + > + if (index >= 0) { > + vector = assigned_dev->guest_msix_entries[index].vector; > kvm_set_irq(assigned_dev->kvm, assigned_dev->irq_source_id, > - assigned_dev->guest_irq, 1); > + vector, 1); > + } > > return IRQ_HANDLED; > } > +#endif > > /* Ack the irq line for an assigned device */ > static void kvm_assigned_dev_ack_irq(struct kvm_irq_ack_notifier *kian) > @@ -279,7 +285,7 @@ static int assigned_device_enable_host_msix(struct > kvm *kvm, > > for (i = 0; i < dev->entries_nr; i++) { > r = request_threaded_irq(dev->host_msix_entries[i].vector, > - NULL, kvm_assigned_dev_thread, > + NULL, kvm_assigned_dev_thread_msix, > 0, dev->irq_name, dev); > if (r) > goto err; > -- > 1.7.3.4 > -- > To unsubscribe from this list: send the line "unsubscribe kvm" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html