irq: remove >= nr_irqs checking with config_have_sparse_irq
Yinghai Lu [Wed, 20 Aug 2008 03:50:14 +0000 (20:50 -0700)]
remove irq limit checks - nr_irqs is dynamic and we expand anytime.

v2: fix checking about result irq_cfg_without_new, so could use msi again
v3: use irq_desc_without_new to check irq is valid

Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>

arch/x86/kernel/io_apic_64.c
arch/x86/kernel/irq_64.c
kernel/irq/chip.c
kernel/irq/manage.c

index 60d6006..1b8cccb 100644 (file)
@@ -400,7 +400,6 @@ static inline void io_apic_sync(unsigned int apic)
        struct irq_cfg *cfg;                                            \
        struct irq_pin_list *entry;                                     \
                                                                        \
-       BUG_ON(irq >= nr_irqs);                                         \
        cfg = irq_cfg(irq);                                             \
        entry = cfg->irq_2_pin;                                         \
        for (;;) {                                                      \
@@ -480,7 +479,6 @@ static void __target_IO_APIC_irq(unsigned int irq, unsigned int dest, u8 vector)
        struct irq_cfg *cfg;
        struct irq_pin_list *entry;
 
-       BUG_ON(irq >= nr_irqs);
        cfg = irq_cfg(irq);
        entry = cfg->irq_2_pin;
        for (;;) {
@@ -549,7 +547,6 @@ static void add_pin_to_irq(unsigned int irq, int apic, int pin)
        struct irq_cfg *cfg;
        struct irq_pin_list *entry;
 
-       BUG_ON(irq >= nr_irqs);
        /* first time to refer irq_cfg, so with new */
        cfg = irq_cfg_alloc(irq);
        entry = cfg->irq_2_pin;
@@ -841,7 +838,6 @@ int IO_APIC_get_PCI_irq_vector(int bus, int slot, int pin)
                                best_guess = irq;
                }
        }
-       BUG_ON(best_guess >= nr_irqs);
        return best_guess;
 }
 
@@ -973,7 +969,6 @@ static int pin_2_irq(int idx, int apic, int pin)
                        irq += nr_ioapic_registers[i++];
                irq += pin;
        }
-       BUG_ON(irq >= nr_irqs);
        return irq;
 }
 
@@ -1008,7 +1003,6 @@ static int __assign_irq_vector(int irq, cpumask_t mask)
        int cpu;
        struct irq_cfg *cfg;
 
-       BUG_ON((unsigned)irq >= nr_irqs);
        cfg = irq_cfg(irq);
 
        /* Only try and allocate irqs on cpus that are present */
@@ -1082,7 +1076,6 @@ static void __clear_irq_vector(int irq)
        cpumask_t mask;
        int cpu, vector;
 
-       BUG_ON((unsigned)irq >= nr_irqs);
        cfg = irq_cfg(irq);
        BUG_ON(!cfg->vector);
 
@@ -1924,8 +1917,6 @@ asmlinkage void smp_irq_move_cleanup_interrupt(void)
                struct irq_desc *desc;
                struct irq_cfg *cfg;
                irq = __get_cpu_var(vector_irq)[vector];
-               if (irq >= nr_irqs)
-                       continue;
 
                desc = irq_to_desc(irq);
                cfg = irq_cfg(irq);
index b3cf55e..a3e3633 100644 (file)
@@ -202,7 +202,7 @@ asmlinkage unsigned int do_IRQ(struct pt_regs *regs)
        stack_overflow_check(regs);
 #endif
 
-       if (likely(irq < nr_irqs))
+       if (likely(__irq_to_desc(irq)))
                generic_handle_irq(irq);
        else {
                if (!disable_apic)
index 2aa3d4b..a4bb0da 100644 (file)
@@ -27,13 +27,13 @@ void dynamic_irq_init(unsigned int irq)
        struct irq_desc *desc;
        unsigned long flags;
 
-       if (irq >= nr_irqs) {
+       desc = irq_to_desc(irq);
+       if (!desc) {
                WARN(1, KERN_ERR "Trying to initialize invalid IRQ%d\n", irq);
                return;
        }
 
        /* Ensure we don't have left over values from a previous use of this irq */
-       desc = irq_to_desc(irq);
        spin_lock_irqsave(&desc->lock, flags);
        desc->status = IRQ_DISABLED;
        desc->chip = &no_irq_chip;
@@ -60,12 +60,12 @@ void dynamic_irq_cleanup(unsigned int irq)
        struct irq_desc *desc;
        unsigned long flags;
 
-       if (irq >= nr_irqs) {
+       desc = __irq_to_desc(irq);
+       if (!desc) {
                WARN(1, KERN_ERR "Trying to cleanup invalid IRQ%d\n", irq);
                return;
        }
 
-       desc = irq_to_desc(irq);
        spin_lock_irqsave(&desc->lock, flags);
        if (desc->action) {
                spin_unlock_irqrestore(&desc->lock, flags);
@@ -92,7 +92,8 @@ int set_irq_chip(unsigned int irq, struct irq_chip *chip)
        struct irq_desc *desc;
        unsigned long flags;
 
-       if (irq >= nr_irqs) {
+       desc = __irq_to_desc(irq);
+       if (!desc) {
                WARN(1, KERN_ERR "Trying to install chip for IRQ%d\n", irq);
                return -EINVAL;
        }
@@ -121,12 +122,12 @@ int set_irq_type(unsigned int irq, unsigned int type)
        unsigned long flags;
        int ret = -ENXIO;
 
-       if (irq >= nr_irqs) {
+       desc = __irq_to_desc(irq);
+       if (!desc) {
                printk(KERN_ERR "Trying to set irq type for IRQ%d\n", irq);
                return -ENODEV;
        }
 
-       desc = irq_to_desc(irq);
        if (type == IRQ_TYPE_NONE)
                return 0;
 
@@ -149,13 +150,13 @@ int set_irq_data(unsigned int irq, void *data)
        struct irq_desc *desc;
        unsigned long flags;
 
-       if (irq >= nr_irqs) {
+       desc = __irq_to_desc(irq);
+       if (!desc) {
                printk(KERN_ERR
                       "Trying to install controller data for IRQ%d\n", irq);
                return -EINVAL;
        }
 
-       desc = irq_to_desc(irq);
        spin_lock_irqsave(&desc->lock, flags);
        desc->handler_data = data;
        spin_unlock_irqrestore(&desc->lock, flags);
@@ -175,12 +176,13 @@ int set_irq_msi(unsigned int irq, struct msi_desc *entry)
        struct irq_desc *desc;
        unsigned long flags;
 
-       if (irq >= nr_irqs) {
+       desc = __irq_to_desc(irq);
+       if (!desc) {
                printk(KERN_ERR
                       "Trying to install msi data for IRQ%d\n", irq);
                return -EINVAL;
        }
-       desc = irq_to_desc(irq);
+
        spin_lock_irqsave(&desc->lock, flags);
        desc->msi_desc = entry;
        if (entry)
@@ -201,8 +203,14 @@ int set_irq_chip_data(unsigned int irq, void *data)
        struct irq_desc *desc;
        unsigned long flags;
 
-       desc = irq_to_desc(irq);
-       if (irq >= nr_irqs || !desc->chip) {
+       desc = __irq_to_desc(irq);
+       if (!desc) {
+               printk(KERN_ERR
+                      "Trying to install chip data for IRQ%d\n", irq);
+               return -EINVAL;
+       }
+
+       if (!desc->chip) {
                printk(KERN_ERR "BUG: bad set_irq_chip_data(IRQ#%d)\n", irq);
                return -EINVAL;
        }
@@ -546,14 +554,13 @@ __set_irq_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained,
        struct irq_desc *desc;
        unsigned long flags;
 
-       if (irq >= nr_irqs) {
+       desc = __irq_to_desc(irq);
+       if (!desc) {
                printk(KERN_ERR
                       "Trying to install type control for IRQ%d\n", irq);
                return;
        }
 
-       desc = irq_to_desc(irq);
-
        if (!handle)
                handle = handle_bad_irq;
        else if (desc->chip == &no_irq_chip) {
@@ -611,14 +618,13 @@ void __init set_irq_noprobe(unsigned int irq)
        struct irq_desc *desc;
        unsigned long flags;
 
-       if (irq >= nr_irqs) {
+       desc = __irq_to_desc(irq);
+       if (!desc) {
                printk(KERN_ERR "Trying to mark IRQ%d non-probeable\n", irq);
 
                return;
        }
 
-       desc = irq_to_desc(irq);
-
        spin_lock_irqsave(&desc->lock, flags);
        desc->status |= IRQ_NOPROBE;
        spin_unlock_irqrestore(&desc->lock, flags);
@@ -629,14 +635,13 @@ void __init set_irq_probe(unsigned int irq)
        struct irq_desc *desc;
        unsigned long flags;
 
-       if (irq >= nr_irqs) {
+       desc = __irq_to_desc(irq);
+       if (!desc) {
                printk(KERN_ERR "Trying to mark IRQ%d probeable\n", irq);
 
                return;
        }
 
-       desc = irq_to_desc(irq);
-
        spin_lock_irqsave(&desc->lock, flags);
        desc->status &= ~IRQ_NOPROBE;
        spin_unlock_irqrestore(&desc->lock, flags);
index 5070f55..c0b4d4d 100644 (file)
@@ -31,10 +31,10 @@ cpumask_t irq_default_affinity = CPU_MASK_ALL;
  */
 void synchronize_irq(unsigned int irq)
 {
-       struct irq_desc *desc = irq_to_desc(irq);
+       struct irq_desc *desc = __irq_to_desc(irq);
        unsigned int status;
 
-       if (irq >= nr_irqs)
+       if (!desc)
                return;
 
        do {
@@ -142,10 +142,11 @@ int irq_select_affinity(unsigned int irq)
  */
 void disable_irq_nosync(unsigned int irq)
 {
-       struct irq_desc *desc = irq_to_desc(irq);
+       struct irq_desc *desc;
        unsigned long flags;
 
-       if (irq >= nr_irqs)
+       desc = __irq_to_desc(irq);
+       if (!desc)
                return;
 
        spin_lock_irqsave(&desc->lock, flags);
@@ -171,9 +172,10 @@ EXPORT_SYMBOL(disable_irq_nosync);
  */
 void disable_irq(unsigned int irq)
 {
-       struct irq_desc *desc = irq_to_desc(irq);
+       struct irq_desc *desc;
 
-       if (irq >= nr_irqs)
+       desc = __irq_to_desc(irq);
+       if (!desc)
                return;
 
        disable_irq_nosync(irq);
@@ -213,10 +215,11 @@ static void __enable_irq(struct irq_desc *desc, unsigned int irq)
  */
 void enable_irq(unsigned int irq)
 {
-       struct irq_desc *desc = irq_to_desc(irq);
+       struct irq_desc *desc;
        unsigned long flags;
 
-       if (irq >= nr_irqs)
+       desc = __irq_to_desc(irq);
+       if (!desc)
                return;
 
        spin_lock_irqsave(&desc->lock, flags);
@@ -290,10 +293,14 @@ EXPORT_SYMBOL(set_irq_wake);
  */
 int can_request_irq(unsigned int irq, unsigned long irqflags)
 {
-       struct irq_desc *desc = irq_to_desc(irq);
+       struct irq_desc *desc;
        struct irqaction *action;
 
-       if (irq >= nr_irqs || desc->status & IRQ_NOREQUEST)
+       desc = __irq_to_desc(irq);
+       if (!desc)
+               return 0;
+
+       if (desc->status & IRQ_NOREQUEST)
                return 0;
 
        action = desc->action;
@@ -352,14 +359,15 @@ int __irq_set_trigger(struct irq_desc *desc, unsigned int irq,
  */
 int setup_irq(unsigned int irq, struct irqaction *new)
 {
-       struct irq_desc *desc = irq_to_desc(irq);
+       struct irq_desc *desc;
        struct irqaction *old, **p;
        const char *old_name = NULL;
        unsigned long flags;
        int shared = 0;
        int ret;
 
-       if (irq >= nr_irqs)
+       desc = __irq_to_desc(irq);
+       if (!desc)
                return -EINVAL;
 
        if (desc->chip == &no_irq_chip)
@@ -518,10 +526,11 @@ void free_irq(unsigned int irq, void *dev_id)
        unsigned long flags;
 
        WARN_ON(in_interrupt());
-       if (irq >= nr_irqs)
+
+       desc = __irq_to_desc(irq);
+       if (!desc)
                return;
 
-       desc = irq_to_desc(irq);
        spin_lock_irqsave(&desc->lock, flags);
        p = &desc->action;
        for (;;) {
@@ -634,9 +643,11 @@ int request_irq(unsigned int irq, irq_handler_t handler,
         */
        if ((irqflags & IRQF_SHARED) && !dev_id)
                return -EINVAL;
-       if (irq >= nr_irqs)
+
+       desc = __irq_to_desc(irq);
+       if (!desc)
                return -EINVAL;
-       desc = irq_to_desc(irq);
+
        if (desc->status & IRQ_NOREQUEST)
                return -EINVAL;
        if (!handler)