x86: use 28 bits irq NR for pci msi/msix and ht
[deliverable/linux.git] / arch / x86 / kernel / irq_64.c
index 4a0a4eb44dcb3d37c306b771cc015e422484e16e..348a11168c2b391f5147bd613f169b93a42446f1 100644 (file)
@@ -70,9 +70,27 @@ static inline void stack_overflow_check(struct pt_regs *regs)
 
 int show_interrupts(struct seq_file *p, void *v)
 {
-       int i = *(loff_t *) v, j;
+       int i, j;
        struct irqaction * action;
        unsigned long flags;
+       unsigned int entries;
+       struct irq_desc *desc;
+       int tail = 0;
+
+#ifdef CONFIG_HAVE_SPARSE_IRQ
+       desc = (struct irq_desc *)v;
+       entries = -1U;
+       i = desc->irq;
+       if (!desc->next)
+               tail = 1;
+#else
+       entries = nr_irqs - 1;
+       i = *(loff_t *) v;
+       if (i == nr_irqs)
+               tail = 1;
+       else
+               desc = irq_to_desc(i);
+#endif
 
        if (i == 0) {
                seq_printf(p, "           ");
@@ -81,9 +99,8 @@ int show_interrupts(struct seq_file *p, void *v)
                seq_putc(p, '\n');
        }
 
-       if (i < nr_irqs) {
+       if (i <= entries) {
                unsigned any_count = 0;
-               struct irq_desc *desc = irq_to_desc(i);
 
                spin_lock_irqsave(&desc->lock, flags);
 #ifndef CONFIG_SMP
@@ -95,7 +112,7 @@ int show_interrupts(struct seq_file *p, void *v)
                action = desc->action;
                if (!action && !any_count)
                        goto skip;
-               seq_printf(p, "%3d: ",i);
+               seq_printf(p, "%#x: ",i);
 #ifndef CONFIG_SMP
                seq_printf(p, "%10u ", kstat_irqs(i));
 #else
@@ -113,7 +130,9 @@ int show_interrupts(struct seq_file *p, void *v)
                seq_putc(p, '\n');
 skip:
                spin_unlock_irqrestore(&desc->lock, flags);
-       } else if (i == nr_irqs) {
+       }
+
+       if (tail) {
                seq_printf(p, "NMI: ");
                for_each_online_cpu(j)
                        seq_printf(p, "%10u ", cpu_pda(j)->__nmi_count);
@@ -152,6 +171,7 @@ skip:
                seq_printf(p, "  Spurious interrupts\n");
                seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
        }
+
        return 0;
 }
 
@@ -189,6 +209,7 @@ u64 arch_irq_stat(void)
 asmlinkage unsigned int do_IRQ(struct pt_regs *regs)
 {
        struct pt_regs *old_regs = set_irq_regs(regs);
+       struct irq_desc *desc;
 
        /* high bit used in ret_from_ code  */
        unsigned vector = ~regs->orig_ax;
@@ -202,8 +223,9 @@ asmlinkage unsigned int do_IRQ(struct pt_regs *regs)
        stack_overflow_check(regs);
 #endif
 
-       if (likely(irq < nr_irqs))
-               generic_handle_irq(irq);
+       desc = irq_to_desc(irq);
+       if (likely(desc))
+               generic_handle_irq_desc(irq, desc);
        else {
                if (!disable_apic)
                        ack_APIC_irq();
@@ -224,17 +246,16 @@ void fixup_irqs(cpumask_t map)
 {
        unsigned int irq;
        static int warned;
+       struct irq_desc *desc;
 
-       for (irq = 0; irq < nr_irqs; irq++) {
+       for_each_irq_desc(irq, desc) {
                cpumask_t mask;
                int break_affinity = 0;
                int set_affinity = 1;
-               struct irq_desc *desc;
 
                if (irq == 2)
                        continue;
 
-               desc = irq_to_desc(irq);
                /* interrupt's are disabled at this point */
                spin_lock(&desc->lock);
 
This page took 0.032492 seconds and 5 git commands to generate.