[patch] fix irq routing by moving it to the correct place

Jes Sorensen <[email protected]>
Newsgroups org.kernel.vger.kvm-ia64,org.kernel.vger.kvm
Message-ID <[email protected]>
Hi,

Some freak :-) put x86 specific irq routing into the generic code path,
which obviously won't work on non-x86 systems.

This patch creates kvm_arch_init_irq_routing() and moves the x86
gibberish to it's correct location :-)

Now I have networking again!

Cheers,
Jes
0006-qemu-kvm-irq-routing.patch (text/x-patch, 3.2 KB)
Platform specific IRQ routing doesn't belong in the generic codepath.
Create kvm_arch_init_irq_routing() and move the x86 specific routing
setup to the appropriate place.

With this interrupts are delivered again on ia64.

Signed-off-by: Jes Sorensen <[email protected]>

---
 qemu-kvm-ia64.c |    4 ++++
 qemu-kvm-x86.c  |   30 ++++++++++++++++++++++++++++++
 qemu-kvm.c      |   23 ++---------------------
 qemu-kvm.h      |    2 ++
 4 files changed, 38 insertions(+), 21 deletions(-)

Index: qemu-kvm/qemu-kvm-ia64.c
===================================================================
--- qemu-kvm.orig/qemu-kvm-ia64.c
+++ qemu-kvm/qemu-kvm-ia64.c
@@ -144,3 +144,7 @@
     struct ioperm_data *data = _data;
     ioperm(data->start_port, data->num, data->turn_on);
 }
+
+void kvm_arch_init_irq_routing(void)
+{
+}
Index: qemu-kvm/qemu-kvm-x86.c
===================================================================
--- qemu-kvm.orig/qemu-kvm-x86.c
+++ qemu-kvm/qemu-kvm-x86.c
@@ -879,3 +879,33 @@
         return true;
     return false;
 }
+
+/*
+ * Setup x86 specific IRQ routing
+ */
+void kvm_arch_init_irq_routing(void)
+{
+    int i;
+
+    if (kvm_irqchip && kvm_has_gsi_routing(kvm_context)) {
+        kvm_clear_gsi_routes(kvm_context);
+        for (i = 0; i < 8; ++i) {
+            if (i == 2)
+                continue;
+            r = kvm_add_irq_route(kvm_context, i, KVM_IRQCHIP_PIC_MASTER, i);
+            if (r < 0)
+                return r;
+        }
+        for (i = 8; i < 16; ++i) {
+            r = kvm_add_irq_route(kvm_context, i, KVM_IRQCHIP_PIC_SLAVE, i - 8);
+            if (r < 0)
+                return r;
+        }
+        for (i = 0; i < 24; ++i) {
+            r = kvm_add_irq_route(kvm_context, i, KVM_IRQCHIP_IOAPIC, i);
+            if (r < 0)
+                return r;
+        }
+        kvm_commit_irq_routes(kvm_context);
+    }
+}
Index: qemu-kvm/qemu-kvm.c
===================================================================
--- qemu-kvm.orig/qemu-kvm.c
+++ qemu-kvm/qemu-kvm.c
@@ -792,27 +792,8 @@
         }
     }
 
-    if (kvm_irqchip && kvm_has_gsi_routing(kvm_context)) {
-        kvm_clear_gsi_routes(kvm_context);
-        for (i = 0; i < 8; ++i) {
-            if (i == 2)
-                continue;
-            r = kvm_add_irq_route(kvm_context, i, KVM_IRQCHIP_PIC_MASTER, i);
-            if (r < 0)
-                return r;
-        }
-        for (i = 8; i < 16; ++i) {
-            r = kvm_add_irq_route(kvm_context, i, KVM_IRQCHIP_PIC_SLAVE, i - 8);
-            if (r < 0)
-                return r;
-        }
-        for (i = 0; i < 24; ++i) {
-            r = kvm_add_irq_route(kvm_context, i, KVM_IRQCHIP_IOAPIC, i);
-            if (r < 0)
-                return r;
-        }
-        kvm_commit_irq_routes(kvm_context);
-    }
+    kvm_arch_init_irq_routing();
+
     return 0;
 }
 
Index: qemu-kvm/qemu-kvm.h
===================================================================
--- qemu-kvm.orig/qemu-kvm.h
+++ qemu-kvm/qemu-kvm.h
@@ -126,6 +126,8 @@
 int kvm_coalesce_mmio_region(target_phys_addr_t start, ram_addr_t size);
 int kvm_uncoalesce_mmio_region(target_phys_addr_t start, ram_addr_t size);
 
+void kvm_arch_init_irq_routing(void);
+
 #ifdef USE_KVM_DEVICE_ASSIGNMENT
 struct ioperm_data;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.