[IA64] Initialize interrupts later (from init_IRQ())
authorTony Luck <tony.luck@intel.com>
Tue, 5 Oct 2010 22:41:25 +0000 (15:41 -0700)
committerTony Luck <tony.luck@intel.com>
Tue, 5 Oct 2010 22:41:25 +0000 (15:41 -0700)
Thomas Gleixner is cleaning up the generic irq code, and ia64 ran
into problems because it calls register_intr() before early_irq_init()
is called.  Move the call to acpi_boot_init() from setup_arch() to
init_IRQ().

As a bonus - moving the call later means we no longer need the
hacks in iosapic.c to switch between the bootmem and regular
allocator - we can just used kzalloc() for allocation.

Signed-off-by: Tony Luck <tony.luck@intel.com>
arch/ia64/kernel/iosapic.c
arch/ia64/kernel/irq_ia64.c
arch/ia64/kernel/setup.c

index 7ded76658d2da69075bb0c748d73c8159beda9dd..66ec07806ad9db030e4d16c5ae7b41905a88f9ec 100644 (file)
 #define DBG(fmt...)
 #endif
 
-#define NR_PREALLOCATE_RTE_ENTRIES \
-       (PAGE_SIZE / sizeof(struct iosapic_rte_info))
-#define RTE_PREALLOCATED       (1)
-
 static DEFINE_SPINLOCK(iosapic_lock);
 
 /*
@@ -136,7 +132,6 @@ struct iosapic_rte_info {
        struct list_head rte_list;      /* RTEs sharing the same vector */
        char            rte_index;      /* IOSAPIC RTE index */
        int             refcnt;         /* reference counter */
-       unsigned int    flags;          /* flags */
        struct iosapic  *iosapic;
 } ____cacheline_aligned;
 
@@ -155,9 +150,6 @@ static struct iosapic_intr_info {
 
 static unsigned char pcat_compat __devinitdata;        /* 8259 compatibility flag */
 
-static int iosapic_kmalloc_ok;
-static LIST_HEAD(free_rte_list);
-
 static inline void
 iosapic_write(struct iosapic *iosapic, unsigned int reg, u32 val)
 {
@@ -552,37 +544,6 @@ iosapic_reassign_vector (int irq)
        }
 }
 
-static struct iosapic_rte_info * __init_refok iosapic_alloc_rte (void)
-{
-       int i;
-       struct iosapic_rte_info *rte;
-       int preallocated = 0;
-
-       if (!iosapic_kmalloc_ok && list_empty(&free_rte_list)) {
-               rte = alloc_bootmem(sizeof(struct iosapic_rte_info) *
-                                   NR_PREALLOCATE_RTE_ENTRIES);
-               for (i = 0; i < NR_PREALLOCATE_RTE_ENTRIES; i++, rte++)
-                       list_add(&rte->rte_list, &free_rte_list);
-       }
-
-       if (!list_empty(&free_rte_list)) {
-               rte = list_entry(free_rte_list.next, struct iosapic_rte_info,
-                                rte_list);
-               list_del(&rte->rte_list);
-               preallocated++;
-       } else {
-               rte = kmalloc(sizeof(struct iosapic_rte_info), GFP_ATOMIC);
-               if (!rte)
-                       return NULL;
-       }
-
-       memset(rte, 0, sizeof(struct iosapic_rte_info));
-       if (preallocated)
-               rte->flags |= RTE_PREALLOCATED;
-
-       return rte;
-}
-
 static inline int irq_is_shared (int irq)
 {
        return (iosapic_intr_info[irq].count > 1);
@@ -615,7 +576,7 @@ register_intr (unsigned int gsi, int irq, unsigned char delivery,
 
        rte = find_rte(irq, gsi);
        if (!rte) {
-               rte = iosapic_alloc_rte();
+               rte = kzalloc(sizeof (*rte), GFP_ATOMIC);
                if (!rte) {
                        printk(KERN_WARNING "%s: cannot allocate memory\n",
                               __func__);
@@ -1161,10 +1122,3 @@ map_iosapic_to_node(unsigned int gsi_base, int node)
        return;
 }
 #endif
-
-static int __init iosapic_enable_kmalloc (void)
-{
-       iosapic_kmalloc_ok = 1;
-       return 0;
-}
-core_initcall (iosapic_enable_kmalloc);
index f14c35f9b03a469cc8ef19e84283cf9d7071b90d..07d4f94e40ba72724a24f5c2e72243cdbae676d5 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/bitops.h>
 #include <linux/irq.h>
 #include <linux/ratelimit.h>
+#include <linux/acpi.h>
 
 #include <asm/delay.h>
 #include <asm/intrinsics.h>
@@ -650,6 +651,9 @@ ia64_native_register_ipi(void)
 void __init
 init_IRQ (void)
 {
+#ifdef CONFIG_ACPI
+       acpi_boot_init();
+#endif
        ia64_register_ipi();
        register_percpu_irq(IA64_SPURIOUS_INT_VECTOR, NULL);
 #ifdef CONFIG_SMP
index 8fb958abf8d008e95259f209d4caf7e53420b009..911cf974970008c6e01a92c36c2d1233ece62f8a 100644 (file)
@@ -594,10 +594,6 @@ setup_arch (char **cmdline_p)
        cpu_init();     /* initialize the bootstrap CPU */
        mmu_context_init();     /* initialize context_id bitmap */
 
-#ifdef CONFIG_ACPI
-       acpi_boot_init();
-#endif
-
        paravirt_banner();
        paravirt_arch_setup_console(cmdline_p);