• D
    xen-netfront: use different locks for Rx and Tx stats · 900e1833
    David Vrabel 提交于
    In netfront the Rx and Tx path are independent and use different
    locks.  The Tx lock is held with hard irqs disabled, but Rx lock is
    held with only BH disabled.  Since both sides use the same stats lock,
    a deadlock may occur.
    
      [ INFO: possible irq lock inversion dependency detected ]
      3.16.2 #16 Not tainted
      ---------------------------------------------------------
      swapper/0/0 just changed the state of lock:
       (&(&queue->tx_lock)->rlock){-.....}, at: [<c03adec8>]
      xennet_tx_interrupt+0x14/0x34
      but this lock took another, HARDIRQ-unsafe lock in the past:
       (&stat->syncp.seq#2){+.-...}
      and interrupts could create inverse lock ordering between them.
      other info that might help us debug this:
       Possible interrupt unsafe locking scenario:
    
             CPU0                    CPU1
             ----                    ----
        lock(&stat->syncp.seq#2);
                                     local_irq_disable();
                                     lock(&(&queue->tx_lock)->rlock);
                                     lock(&stat->syncp.seq#2);
        <Interrupt>
          lock(&(&queue->tx_lock)->rlock);
    
    Using separate locks for the Rx and Tx stats fixes this deadlock.
    Reported-by: NDmitry Piotrovsky <piotrovskydmitry@gmail.com>
    Signed-off-by: NDavid Vrabel <david.vrabel@citrix.com>
    Signed-off-by: NDavid S. Miller <davem@davemloft.net>
    900e1833
xen-netfront.c 55.4 KB