> 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 <[email protected]>
> ---
>  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 [email protected]
> 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 [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to