linux/arch/sparc
Hong H. Pham 280ff97494 sparc64: fix and optimize irq distribution
irq_choose_cpu() should compare the affinity mask against cpu_online_map
rather than CPU_MASK_ALL, since irq_select_affinity() sets the interrupt's
affinity mask to cpu_online_map "and" CPU_MASK_ALL (which ends up being
just cpu_online_map).  The mask comparison in irq_choose_cpu() will always
fail since the two masks are not the same.  So the CPU chosen is the first CPU
in the intersection of cpu_online_map and CPU_MASK_ALL, which is always CPU0.
That means all interrupts are reassigned to CPU0...

Distributing interrupts to CPUs in a linearly increasing round robin fashion
is not optimal for the UltraSPARC T1/T2.  Also, the irq_rover in
irq_choose_cpu() causes an interrupt to be assigned to a different
processor each time the interrupt is allocated and released.  This may lead
to an unbalanced distribution over time.

A static mapping of interrupts to processors is done to optimize and balance
interrupt distribution.  For the T1/T2, interrupts are spread to different
cores first, and then to strands within a core.

The following is some benchmarks showing the effects of interrupt
distribution on a T2.  The test was done with iperf using a pair of T5220
boxes, each with a 10GBe NIU (XAUI) connected back to back.

  TCP     | Stock       Linear RR IRQ  Optimized IRQ
  Streams | 2.6.30-rc5  Distribution   Distribution
          | GBits/sec   GBits/sec      GBits/sec
  --------+-----------------------------------------
    1       0.839       0.862          0.868
    8       1.16        4.96           5.88
   16       1.15        6.40           8.04
  100       1.09        7.28           8.68

Signed-off-by: Hong H. Pham <hong.pham@windriver.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2009-06-16 04:56:28 -07:00
..
boot sparc,sparc64: unify boot/ 2008-12-04 09:17:21 -08:00
configs sparc32: Update defconfig. 2009-04-17 04:05:06 -07:00
include/asm sparc64: Get rid of real_setup_per_cpu_areas(). 2009-06-16 04:56:23 -07:00
kernel sparc64: fix and optimize irq distribution 2009-06-16 04:56:28 -07:00
lib sparc64: Fix section attribute warnings. 2009-05-29 16:12:02 -07:00
math-emu sparc64: unify math-emu 2008-12-04 09:16:56 -08:00
mm sparc64: Get rid of real_setup_per_cpu_areas(). 2009-06-16 04:56:23 -07:00
oprofile sparc64: Implement NMI watchdog on capable cpus. 2009-01-30 00:03:53 -08:00
prom sparc: Eliminate PROMLIB_INTERNAL as it does nothing 2009-01-08 16:59:01 -08:00
Kconfig sparc64: Use new dynamic per-cpu allocator. 2009-06-16 04:56:27 -07:00
Kconfig.debug generic debug pagealloc: build fix 2009-04-02 19:04:48 -07:00
Makefile sparc: unify kernel/init_task 2008-12-04 13:28:09 -08:00