WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH 05/20] xen: identity map gsi->irqs

From: Jeremy Fitzhardinge <jeremy.fitzhardinge@xxxxxxxxxx>

Impact: preserve compat with native

Reserve the lower irq range for use for hardware interrupts so we
can identity-map them.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@xxxxxxxxxx>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
---
 drivers/xen/events.c |   23 +++++++++++++++++------
 1 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/drivers/xen/events.c b/drivers/xen/events.c
index 288077f..b6de004 100644
--- a/drivers/xen/events.c
+++ b/drivers/xen/events.c
@@ -32,6 +32,7 @@
 #include <asm/ptrace.h>
 #include <asm/irq.h>
 #include <asm/idle.h>
+#include <asm/io_apic.h>
 #include <asm/sync_bitops.h>
 #include <asm/xen/hypercall.h>
 #include <asm/xen/hypervisor.h>
@@ -41,9 +42,6 @@
 #include <xen/interface/xen.h>
 #include <xen/interface/event_channel.h>
 
-/* Leave low irqs free for identity mapping */
-#define LEGACY_IRQS    16
-
 /*
  * This lock protects updates to the following mapping and reference-count
  * arrays. The lock does not need to be acquired to read the mapping tables.
@@ -345,12 +343,24 @@ static void unmask_evtchn(int port)
        put_cpu();
 }
 
+static int get_nr_hw_irqs(void)
+{
+       int ret = 1;
+
+#ifdef CONFIG_X86_IO_APIC
+       ret = get_nr_irqs_gsi();
+#endif
+
+       return ret;
+}
+
 static int find_unbound_irq(void)
 {
        int irq;
        struct irq_desc *desc;
+       int start = get_nr_hw_irqs();
 
-       for (irq = LEGACY_IRQS; irq < nr_irqs; irq++)
+       for (irq = start; irq < nr_irqs; irq++)
                if (irq_info[irq].type == IRQT_UNBOUND)
                        break;
 
@@ -368,8 +378,8 @@ static int find_unbound_irq(void)
 
 static bool identity_mapped_irq(unsigned irq)
 {
-       /* only identity map legacy irqs */
-       return irq < LEGACY_IRQS;
+       /* identity map all the hardware irqs */
+       return irq < get_nr_hw_irqs();
 }
 
 static void pirq_unmask_notify(int irq)
@@ -538,6 +548,7 @@ int xen_allocate_pirq(unsigned gsi)
 
        if (identity_mapped_irq(gsi)) {
                irq = gsi;
+               irq_to_desc_alloc_node(irq, 0);
                dynamic_irq_init(irq);
        } else
                irq = find_unbound_irq();
-- 
1.7.0.1


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

<Prev in Thread] Current Thread [Next in Thread>