RE: [PATCH] KVM: Split up MSI-X assigned device IRQ handler

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> 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


[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux