gianfar: Fix soft lockup with multi-interrupt TSECs
This patch fixes following bug:
BUG: soft lockup - CPU#0 stuck for 61s! [S03mountvirtfs-:922]
Modules linked in:
NIP: 
c006505c LR: 
c00675f0 CTR: 
c0020438
REGS: 
c7a1db90 TRAP: 0901   Not tainted  (
2.6.28-rc8-01311-g8c7396a)
MSR: 
00009032 <EE,ME,IR,DR>  CR: 
28248442  XER: 
20000000
TASK = 
c7a288a0[922] 'S03mountvirtfs-' THREAD: 
c7a1c000
GPR00: 
00009032 c7a1dc40 c7a288a0 00000024 c79a1840 00000000 00000300 00000020
GPR08: 
c035f97c 00000000 00004008 c04d5210 00000000
NIP [
c006505c] handle_IRQ_event+0x34/0xb0
LR [
c00675f0] handle_level_irq+0xa8/0x144
Call Trace:
[
c7a1dc40] [
c00204d8] ipic_mask_irq+0xa0/0xb4 (unreliable)
[
c7a1dc60] [
c00675f0] handle_level_irq+0xa8/0x144
[
c7a1dc80] [
c00067f8] do_IRQ+0x78/0x108
[
c7a1dc90] [
c0014d7c] ret_from_except+0x0/0x14
--- Exception: 501 at gfar_schedule_cleanup+0x54/0x7c
    LR = gfar_transmit+0x14/0x28
[
c7a1dd50] [
c0352a3c] _spin_unlock_irqrestore+0x18/0x30 (unreliable)
[
c7a1dd60] [
c01f49a8] gfar_transmit+0x14/0x28
[
c7a1dd70] [
c0065084] handle_IRQ_event+0x5c/0xb0
[
c7a1dd90] [
c00675f0] handle_level_irq+0xa8/0x144
[
c7a1ddb0] [
c00067f8] do_IRQ+0x78/0x108
[
c7a1ddc0] [
c0014d7c] ret_from_except+0x0/0x14
--- Exception: 501 at up_read+0x10/0x48
    LR = do_page_fault+0x2b0/0x3e0
[
c7a1de80] [
c7a177e8] 0xc7a177e8 (unreliable)
[
c7a1de90] [
c0017964] do_page_fault+0x2b0/0x3e0
[
c7a1df40] [
c0014b14] handle_page_fault+0xc/0x80
--- Exception: 301 at 0xfe98b7c
    LR = 0xfe989c0
Instruction dump:
7c0802a6 bf810010 7c9f2378 7c7c1b78 90010024 80040004 70090020 40820010
7c0000a6 60008000 7c000124 3bc00000 <
3ba00000> 
48000010 83ff0014 2f9f0000
The bug introduced by commit 
8c7396aebb68994c0519e438eecdf4d5fa9c7844
("gianfar: Merge Tx and Rx interrupt for scheduling clean up ring").
The commit merged TX and RX interrupt code into a single routine that
schedules NAPI, but no locks were introduced. This causes irq races, so
when irqs are enabled and netif_rx_schedule_prep() returns 0, nobody
disable the interrupts again. This leads to interrupt storm and finally
to the lockup.
Signed-off-by: Anton Vorontsov <avorontsov@ru.mvista.com>
Signed-off-by: David S. Miller <davem@davemloft.net>