• A
    [PATCH] 8139too deadlock fix · bce305f4
    Arjan van de Ven 提交于
    > stack backtrace:
    
    >  [<f9099d31>] rtl8139_start_xmit+0xd9/0xff [8139too]
    >  [<c11ad5ea>] netpoll_send_skb+0x98/0xea
    
    This seems to be a real deadlock...
    
    So netpoll_send_skb takes the _xmit_lock, which is all nitty gritty
    but then rtl8139_start_xmit comes around while that lock is taken, and
    does
    
          spin_unlock_irq(&tp->lock);
    
    which.. enables interrupts and softirqs; this is quite bad because the
    xmit lock is taken in softirq context for the watchdog like this:
      [<c1200376>] _spin_lock+0x23/0x32
      [<c11af282>] dev_watchdog+0x14/0xb1
      [<c101dab2>] run_timer_softirq+0xf2/0x14a
      [<c101a691>] __do_softirq+0x55/0xb0
      [<c1004a8d>] do_softirq+0x58/0xbd
    
    Which would deadlock now that the spin_unlock_irq() has enabled
    irqs/softirqs while the _xmit_lock is still held.
    
    The patch below turns this into a irqsave/irqrestore pair so that
    interrupts don't get enabled unconditionally.
    Signed-off-by: NArjan van de Ven <arjan@linux.intel.com>
    Signed-off-by: NIngo Molnar <mingo@elte.hu>
    Signed-off-by: NJeff Garzik <jeff@garzik.org>
    bce305f4
8139too.c 69.5 KB