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-changelog

[Xen-changelog] [linux-2.6.18-xen] evtchn: Clean up pirq/dynirq handling

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [linux-2.6.18-xen] evtchn: Clean up pirq/dynirq handling.
From: "Xen patchbot-linux-2.6.18-xen" <patchbot-linux-2.6.18-xen@xxxxxxxxxxxxxxxxxxx>
Date: Tue, 16 Sep 2008 06:01:20 -0700
Delivery-date: Tue, 16 Sep 2008 06:04:24 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1221557945 -3600
# Node ID 0ba49e9e74f9a6ecb5ae6597b5913b255bb6ed7a
# Parent  de4d39818577c14de7f687ae3eed5745cc903d10
evtchn: Clean up pirq/dynirq handling.

 * Remove dynirq/pirq_to/from_irq() macros. It's clearer to use *_BASE
   and NR_* macros directly.
 * Avoid and fix confusion between a Linux 'pirq' and a Xen
   'pirq'. This is basically done by avoiding the notion of a Linux
   'pirq' at all.
 * Fix IA64 build.

Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
---
 drivers/xen/core/evtchn.c                 |   91 +++++++++++++++---------------
 include/asm-i386/mach-xen/irq_vectors.h   |    6 -
 include/asm-ia64/irq.h                    |    6 -
 include/asm-powerpc/xen/asm/hypervisor.h  |    7 --
 include/asm-x86_64/mach-xen/irq_vectors.h |    6 -
 5 files changed, 46 insertions(+), 70 deletions(-)

diff -r de4d39818577 -r 0ba49e9e74f9 drivers/xen/core/evtchn.c
--- a/drivers/xen/core/evtchn.c Fri Sep 12 10:37:32 2008 +0100
+++ b/drivers/xen/core/evtchn.c Tue Sep 16 10:39:05 2008 +0100
@@ -319,13 +319,11 @@ static int find_unbound_irq(void)
 static int find_unbound_irq(void)
 {
        static int warned;
-       int dynirq, irq;
-
-       for (dynirq = 0; dynirq < NR_DYNIRQS; dynirq++) {
-               irq = dynirq_to_irq(dynirq);
+       int irq;
+
+       for (irq = DYNIRQ_BASE; irq < (DYNIRQ_BASE + NR_DYNIRQS); irq++)
                if (irq_bindcount[irq] == 0)
                        return irq;
-       }
 
        if (!warned) {
                warned = 1;
@@ -761,9 +759,12 @@ void evtchn_register_pirq(int irq)
        irq_info[irq] = mk_irq_info(IRQT_PIRQ, irq, 0);
 }
 
-#ifndef CONFIG_X86_IO_APIC
-#undef IO_APIC_IRQ
-#define IO_APIC_IRQ(irq) ((irq) >= pirq_to_irq(16))
+#if defined(CONFIG_X86_IO_APIC)
+#define identity_mapped_irq(irq) (!IO_APIC_IRQ((irq) - PIRQ_BASE))
+#elif defined(CONFIG_X86)
+#define identity_mapped_irq(irq) (((irq) - PIRQ_BASE) < 16)
+#else
+#define identity_mapped_irq(irq) (0)
 #endif
 
 int evtchn_map_pirq(int irq, int xen_pirq)
@@ -771,10 +772,10 @@ int evtchn_map_pirq(int irq, int xen_pir
        if (irq < 0) {
                static DEFINE_SPINLOCK(irq_alloc_lock);
 
-               irq = pirq_to_irq(NR_PIRQS - 1);
+               irq = PIRQ_BASE + NR_PIRQS - 1;
                spin_lock(&irq_alloc_lock);
                do {
-                       if (!IO_APIC_IRQ(irq))
+                       if (identity_mapped_irq(irq))
                                continue;
                        if (!index_from_irq(irq)) {
                                BUG_ON(type_from_irq(irq) != IRQT_UNBOUND);
@@ -782,9 +783,9 @@ int evtchn_map_pirq(int irq, int xen_pir
                                                            xen_pirq, 0);
                                break;
                        }
-               } while (--irq);
+               } while (--irq >= PIRQ_BASE);
                spin_unlock(&irq_alloc_lock);
-               if (irq < pirq_to_irq(16))
+               if (irq < PIRQ_BASE)
                        return -ENOSPC;
        } else if (!xen_pirq) {
                if (unlikely(type_from_irq(irq) != IRQT_PIRQ))
@@ -803,29 +804,28 @@ int evtchn_map_pirq(int irq, int xen_pir
 
 int evtchn_get_xen_pirq(int irq)
 {
-       if (!IO_APIC_IRQ(irq))
+       if (identity_mapped_irq(irq))
                return irq;
-       if (unlikely(type_from_irq(irq) != IRQT_PIRQ))
-               return 0;
+       BUG_ON(type_from_irq(irq) != IRQT_PIRQ);
        return index_from_irq(irq);
 }
 
-static inline void pirq_unmask_notify(int pirq)
-{
-       struct physdev_eoi eoi = { .irq = pirq };
-       if (unlikely(test_bit(pirq, pirq_needs_eoi)))
+static inline void pirq_unmask_notify(int irq)
+{
+       struct physdev_eoi eoi = { .irq = evtchn_get_xen_pirq(irq) };
+       if (unlikely(test_bit(irq - PIRQ_BASE, pirq_needs_eoi)))
                VOID(HYPERVISOR_physdev_op(PHYSDEVOP_eoi, &eoi));
 }
 
-static inline void pirq_query_unmask(int pirq)
+static inline void pirq_query_unmask(int irq)
 {
        struct physdev_irq_status_query irq_status;
-       irq_status.irq = pirq;
+       irq_status.irq = evtchn_get_xen_pirq(irq);
        if (HYPERVISOR_physdev_op(PHYSDEVOP_irq_status_query, &irq_status))
                irq_status.flags = 0;
-       clear_bit(pirq, pirq_needs_eoi);
+       clear_bit(irq - PIRQ_BASE, pirq_needs_eoi);
        if (irq_status.flags & XENIRQSTAT_needs_eoi)
-               set_bit(pirq, pirq_needs_eoi);
+               set_bit(irq - PIRQ_BASE, pirq_needs_eoi);
 }
 
 /*
@@ -853,7 +853,7 @@ static unsigned int startup_pirq(unsigne
        }
        evtchn = bind_pirq.port;
 
-       pirq_query_unmask(irq_to_pirq(irq));
+       pirq_query_unmask(irq);
 
        evtchn_to_irq[evtchn] = irq;
        bind_evtchn_to_cpu(evtchn, 0);
@@ -861,7 +861,7 @@ static unsigned int startup_pirq(unsigne
 
  out:
        unmask_evtchn(evtchn);
-       pirq_unmask_notify(irq_to_pirq(irq));
+       pirq_unmask_notify(irq);
 
        return 0;
 }
@@ -915,7 +915,7 @@ static void end_pirq(unsigned int irq)
                shutdown_pirq(irq);
        } else if (VALID_EVTCHN(evtchn)) {
                unmask_evtchn(evtchn);
-               pirq_unmask_notify(irq_to_pirq(irq));
+               pirq_unmask_notify(irq);
        }
 }
 
@@ -1062,7 +1062,7 @@ static void restore_cpu_ipis(unsigned in
 
 void irq_resume(void)
 {
-       unsigned int cpu, pirq, irq, evtchn;
+       unsigned int cpu, irq, evtchn;
 
        init_evtchn_cpu_bindings();
 
@@ -1071,8 +1071,8 @@ void irq_resume(void)
                mask_evtchn(evtchn);
 
        /* Check that no PIRQs are still bound. */
-       for (pirq = 0; pirq < NR_PIRQS; pirq++)
-               BUG_ON(irq_info[pirq_to_irq(pirq)] != IRQ_UNBOUND);
+       for (irq = PIRQ_BASE; irq < (PIRQ_BASE + NR_PIRQS); irq++)
+               BUG_ON(irq_info[irq] != IRQ_UNBOUND);
 
        /* No IRQ <-> event-channel mappings. */
        for (irq = 0; irq < NR_IRQS; irq++)
@@ -1102,28 +1102,29 @@ void __init xen_init_IRQ(void)
                irq_info[i] = IRQ_UNBOUND;
 
        /* Dynamic IRQ space is currently unbound. Zero the refcnts. */
-       for (i = 0; i < NR_DYNIRQS; i++) {
-               irq_bindcount[dynirq_to_irq(i)] = 0;
-
-               irq_desc[dynirq_to_irq(i)].status = IRQ_DISABLED;
-               irq_desc[dynirq_to_irq(i)].action = NULL;
-               irq_desc[dynirq_to_irq(i)].depth = 1;
-               irq_desc[dynirq_to_irq(i)].chip = &dynirq_type;
+       for (i = DYNIRQ_BASE; i < (DYNIRQ_BASE + NR_DYNIRQS); i++) {
+               irq_bindcount[i] = 0;
+
+               irq_desc[i].status = IRQ_DISABLED;
+               irq_desc[i].action = NULL;
+               irq_desc[i].depth = 1;
+               irq_desc[i].chip = &dynirq_type;
        }
 
        /* Phys IRQ space is statically bound (1:1 mapping). Nail refcnts. */
-       for (i = 0; i < NR_PIRQS; i++) {
-               irq_bindcount[pirq_to_irq(i)] = 1;
+       for (i = PIRQ_BASE; i < (PIRQ_BASE + NR_PIRQS); i++) {
+               irq_bindcount[i] = 1;
 
 #ifdef RTC_IRQ
                /* If not domain 0, force our RTC driver to fail its probe. */
-               if ((i == RTC_IRQ) && !is_initial_xendomain())
+               if (identity_mapped_irq(i) && ((i - PIRQ_BASE) == RTC_IRQ)
+                   && !is_initial_xendomain())
                        continue;
 #endif
 
-               irq_desc[pirq_to_irq(i)].status = IRQ_DISABLED;
-               irq_desc[pirq_to_irq(i)].action = NULL;
-               irq_desc[pirq_to_irq(i)].depth = 1;
-               irq_desc[pirq_to_irq(i)].chip = &pirq_type;
-       }
-}
+               irq_desc[i].status = IRQ_DISABLED;
+               irq_desc[i].action = NULL;
+               irq_desc[i].depth = 1;
+               irq_desc[i].chip = &pirq_type;
+       }
+}
diff -r de4d39818577 -r 0ba49e9e74f9 include/asm-i386/mach-xen/irq_vectors.h
--- a/include/asm-i386/mach-xen/irq_vectors.h   Fri Sep 12 10:37:32 2008 +0100
+++ b/include/asm-i386/mach-xen/irq_vectors.h   Tue Sep 16 10:39:05 2008 +0100
@@ -122,10 +122,4 @@
 #define NR_IRQS                        (NR_PIRQS + NR_DYNIRQS)
 #define NR_IRQ_VECTORS         NR_IRQS
 
-#define pirq_to_irq(_x)                ((_x) + PIRQ_BASE)
-#define irq_to_pirq(_x)                ((_x) - PIRQ_BASE)
-
-#define dynirq_to_irq(_x)      ((_x) + DYNIRQ_BASE)
-#define irq_to_dynirq(_x)      ((_x) - DYNIRQ_BASE)
-
 #endif /* _ASM_IRQ_VECTORS_H */
diff -r de4d39818577 -r 0ba49e9e74f9 include/asm-ia64/irq.h
--- a/include/asm-ia64/irq.h    Fri Sep 12 10:37:32 2008 +0100
+++ b/include/asm-ia64/irq.h    Tue Sep 16 10:39:05 2008 +0100
@@ -34,12 +34,6 @@
 #define NR_IRQS                        (NR_PIRQS + NR_DYNIRQS)
 #define NR_IRQ_VECTORS         NR_IRQS
 
-#define pirq_to_irq(_x)                ((_x) + PIRQ_BASE)
-#define irq_to_pirq(_x)                ((_x) - PIRQ_BASE)
-
-#define dynirq_to_irq(_x)      ((_x) + DYNIRQ_BASE)
-#define irq_to_dynirq(_x)      ((_x) - DYNIRQ_BASE)
-
 #define RESCHEDULE_VECTOR      0
 #define IPI_VECTOR             1
 #define CMCP_VECTOR            2
diff -r de4d39818577 -r 0ba49e9e74f9 include/asm-powerpc/xen/asm/hypervisor.h
--- a/include/asm-powerpc/xen/asm/hypervisor.h  Fri Sep 12 10:37:32 2008 +0100
+++ b/include/asm-powerpc/xen/asm/hypervisor.h  Tue Sep 16 10:39:05 2008 +0100
@@ -154,13 +154,6 @@ int direct_remap_pfn_range(struct vm_are
 
 #define NR_IRQ_VECTORS         NR_IRQS
 
-#define pirq_to_irq(_x)                ((_x) + PIRQ_BASE)
-#define irq_to_pirq(_x)                ((_x) - PIRQ_BASE)
-
-#define dynirq_to_irq(_x)      ((_x) + DYNIRQ_BASE)
-#define irq_to_dynirq(_x)      ((_x) - DYNIRQ_BASE)
-
-
 /* END:  all of these need a new home */
 
 #if defined(CONFIG_X86_64)
diff -r de4d39818577 -r 0ba49e9e74f9 include/asm-x86_64/mach-xen/irq_vectors.h
--- a/include/asm-x86_64/mach-xen/irq_vectors.h Fri Sep 12 10:37:32 2008 +0100
+++ b/include/asm-x86_64/mach-xen/irq_vectors.h Tue Sep 16 10:39:05 2008 +0100
@@ -114,10 +114,4 @@
 #define NR_IRQS                        (NR_PIRQS + NR_DYNIRQS)
 #define NR_IRQ_VECTORS         NR_IRQS
 
-#define pirq_to_irq(_x)                ((_x) + PIRQ_BASE)
-#define irq_to_pirq(_x)                ((_x) - PIRQ_BASE)
-
-#define dynirq_to_irq(_x)      ((_x) + DYNIRQ_BASE)
-#define irq_to_dynirq(_x)      ((_x) - DYNIRQ_BASE)
-
 #endif /* _ASM_IRQ_VECTORS_H */

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [linux-2.6.18-xen] evtchn: Clean up pirq/dynirq handling., Xen patchbot-linux-2.6.18-xen <=