]> pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
Merge branch 'irq-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorLinus Torvalds <torvalds@linux-foundation.org>
Sun, 30 Nov 2008 21:06:20 +0000 (13:06 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sun, 30 Nov 2008 21:06:20 +0000 (13:06 -0800)
* 'irq-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  irq.h: fix missing/extra kernel-doc
  genirq: __irq_set_trigger: change pr_warning to pr_debug
  irq: fix typo
  x86: apic honour irq affinity which was set in early boot
  genirq: fix the affinity setting in setup_irq
  genirq: keep affinities set from userspace across free/request_irq()

1  2 
arch/x86/kernel/io_apic.c

index 1fec0f9b1508cdc22f2cce5cfef9364cf4022b4f,8e2ed9c359b4637b1a9f98dcd7d0a11bb3fc6fec..9043251210fba4dc32ea7db009a1db6196216453
@@@ -3608,7 -3608,27 +3608,7 @@@ int __init io_apic_get_redir_entries (i
  
  int __init probe_nr_irqs(void)
  {
 -      int idx;
 -      int nr = 0;
 -#ifndef CONFIG_XEN
 -      int nr_min = 32;
 -#else
 -      int nr_min = NR_IRQS;
 -#endif
 -
 -      for (idx = 0; idx < nr_ioapics; idx++)
 -              nr += io_apic_get_redir_entries(idx) + 1;
 -
 -      /* double it for hotplug and msi and nmi */
 -      nr <<= 1;
 -
 -      /* something wrong ? */
 -      if (nr < nr_min)
 -              nr = nr_min;
 -      if (WARN_ON(nr > NR_IRQS))
 -              nr = NR_IRQS;
 -
 -      return nr;
 +      return NR_IRQS;
  }
  
  /* --------------------------------------------------------------------------
@@@ -3755,7 -3775,9 +3755,9 @@@ int acpi_get_override_irq(int bus_irq, 
  void __init setup_ioapic_dest(void)
  {
        int pin, ioapic, irq, irq_entry;
+       struct irq_desc *desc;
        struct irq_cfg *cfg;
+       cpumask_t mask;
  
        if (skip_ioapic_setup == 1)
                return;
                         * cpu is online.
                         */
                        cfg = irq_cfg(irq);
-                       if (!cfg->vector)
+                       if (!cfg->vector) {
                                setup_IO_APIC_irq(ioapic, pin, irq,
                                                  irq_trigger(irq_entry),
                                                  irq_polarity(irq_entry));
+                               continue;
+                       }
+                       /*
+                        * Honour affinities which have been set in early boot
+                        */
+                       desc = irq_to_desc(irq);
+                       if (desc->status &
+                           (IRQ_NO_BALANCING | IRQ_AFFINITY_SET))
+                               mask = desc->affinity;
+                       else
+                               mask = TARGET_CPUS;
  #ifdef CONFIG_INTR_REMAP
-                       else if (intr_remapping_enabled)
-                               set_ir_ioapic_affinity_irq(irq, TARGET_CPUS);
- #endif
+                       if (intr_remapping_enabled)
+                               set_ir_ioapic_affinity_irq(irq, mask);
                        else
-                               set_ioapic_affinity_irq(irq, TARGET_CPUS);
+ #endif
+                               set_ioapic_affinity_irq(irq, mask);
                }
  
        }