Small KVM device assignment cleanups
cover Small KVM device assignment cleanups
Carve-out from my IRQ sharing series: These two cleanups should be applicable earlier, helping to sharpen the focus of the latter.
Jan Kiszka (2):
KVM: Split up MSI-X assigned device IRQ handler
KVM: Clean up unneeded void pointer casts
virt/kvm/assigned-dev.c | 44 +++++++++++++++++++++++++------------------- 1 files changed, 25 insertions(+), 19 deletions(-)
PATCH 1/2 KVM: Split up MSI-X assigned device IRQ handler
From: Jan Kiszka <[email protected]>
The threaded IRQ handler for MSI-X has almost nothing in common with the INTx/MSI handler. Move its code into a dedicated handler.
Signed-off-by Jan Kiszka <[email protected]>
--- virt/kvm/assigned-dev.c | 32 +++++++++++++++++++------------- 1 files changed, 19 insertions(+), 13 deletions(-)
virt/kvm/assigned-dev.c +19 -13
@@ -58,8 +58,6 @@ static int find_index_from_host_irq(struct kvm_assigned_dev_kernelstatic 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)
@@ -277,7 +283,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, (void *)dev);if (r) goto err;
Signature · 1 line
1.7.1
PATCH 2/2 KVM: Clean up unneeded void pointer casts
In reply to Jan KiszkaFrom: Jan Kiszka <[email protected]>
Signed-off-by Jan Kiszka <[email protected]>
--- virt/kvm/assigned-dev.c | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-)
virt/kvm/assigned-dev.c +6 -6
@@ -149,7 +149,7 @@ static void deassign_host_irq(struct kvm *kvm,for (i =0 ; i < assigned_dev->entries_nr; i++)free_irq (assigned_dev->host_msix_entries[i].vector, - (void *)assigned_dev); + assigned_dev); assigned_dev->entries_nr =0 ;kfree (assigned_dev->host_msix_entries);
@@ -159,7 +159,7 @@ static void deassign_host_irq(struct kvm *kvm,/* Deal with MSI and INTx */ disable_irq (assigned_dev->host_irq); -free_irq (assigned_dev->host_irq, (void *)assigned_dev); +free_irq (assigned_dev->host_irq, assigned_dev);if (assigned_dev->irq_requested_type &KVM_DEV_IRQ_HOST_MSI )pci_disable_msi (assigned_dev->dev);
@@ -238,7 +238,7 @@ static int assigned_device_enable_host_intx(struct kvm *kvm,* are going to be long delays in accepting, acking, etc. */ if (request_threaded_irq (dev->host_irq,NULL , kvm_assigned_dev_thread, -IRQF_ONESHOT , dev->irq_name, (void *)dev)) +IRQF_ONESHOT , dev->irq_name, dev))return -EIO ;return 0 ; }
@@ -257,7 +257,7 @@ static int assigned_device_enable_host_msi(struct kvm *kvm, dev->host_irq = dev->dev->irq;if (request_threaded_irq (dev->host_irq,NULL , kvm_assigned_dev_thread, -0 , dev->irq_name, (void *)dev)) { +0 , dev->irq_name, dev)) {pci_disable_msi (dev->dev);return -EIO ; }
@@ -284,7 +284,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_msix, -0 , dev->irq_name, (void *)dev); +0 , dev->irq_name, dev);if (r) goto err; }
@@ -292,7 +292,7 @@ static int assigned_device_enable_host_msix(struct kvm *kvm,return 0 ; err:for (i -=1 ; i >=0 ; i--) -free_irq (dev->host_msix_entries[i].vector, (void *)dev); +free_irq (dev->host_msix_entries[i].vector, dev);pci_disable_msix (dev->dev);return r; }
Signature · 1 line
1.7.1