]> git.baikalelectronics.ru Git - kernel.git/commit
xen-netfront: use different locks for Rx and Tx stats
authorDavid Vrabel <david.vrabel@citrix.com>
Tue, 13 Jan 2015 16:42:42 +0000 (16:42 +0000)
committerDavid S. Miller <davem@davemloft.net>
Tue, 13 Jan 2015 22:22:11 +0000 (17:22 -0500)
commitee4ab10b9c4c4ff230118b6ecf19d125e83e71f8
tree222e2526f5b5f7891a7f1e3bc71deffe3f0ccdd0
parent0a4385fd2fb352c2291f08bd0271066dc4060664
xen-netfront: use different locks for Rx and Tx stats

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: Dmitry Piotrovsky <piotrovskydmitry@gmail.com>
Signed-off-by: David Vrabel <david.vrabel@citrix.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/xen-netfront.c