KVM: Split up MSI-X assigned device IRQ handler
PATCH 1/1 KVM: Split up MSI-X assigned device IRQ handler
The threaded IRQ handler for MSI-X has almost nothing in common with the INTx/MSI handler. Move its code into a dedicated handler.
--- 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)
@@ -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;
Signature · 1 line
1.7.3.4
Quoted 5 lines
From: Jan Kiszka
Sent: Tuesday, September 13, 2011 12:58 AMThe 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
Quoted 76 lines
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 +0
-0@@ -58,8 +58,6 @@ static int find_index_from_host_irq(struct
kvm_assigned_dev_kernel
staticirqreturn_tkvm_assigned_dev_thread(int irq, void *dev_id){virt/kvm/assigned-dev.c +18
-12struct 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)virt/kvm/assigned-dev.c +1
-1@@ -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
Quoted 9 lines · Kevin
Quoted 5 lines
From: Jan Kiszka
Sent: Tuesday, September 13, 2011 12:58 AMThe 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:
You mean http://thread.gmane.org/gmane.comp.emulators.kvm.devel/79075? :)
Jan
Signature · 2 lines
Siemens AG, Corporate Technology, CT T DE IT 1 Corporate Competence Center Embedded Linux
Quoted 10 lines
From: Jan Kiszka [mailto:[email protected]]
Sent: Tuesday, September 13, 2011 3:30 PMQuoted 6 lines · Kevin
Quoted 5 lines
From: Jan Kiszka
Sent: Tuesday, September 13, 2011 12:58 AMThe threaded IRQ handler for MSI-X has almost nothing in common with the INTx/MSI handler. Move its code into a dedicated handler.
Quoted 7 lines
Quoted 3 lines
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:
You mean
http://thread.gmane.org/gmane.comp.emulators.kvm.devel/79075? :)
yes, and sorry that I didn't catch that thread. :-)
Thanks
Kevin
Marcelo Tosatti
AppliedQuoted 7 lines · Jan Kiszka
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(-)
Applied, thanks.