Skip to content

Commit 53d3749

Browse files
congwangdavem330
authored andcommitted
net: avoid updating qdisc_xmit_lock_key in netdev_update_lockdep_key()
syzbot reported some bogus lockdep warnings, for example bad unlock balance in sch_direct_xmit(). They are due to a race condition between slow path and fast path, that is qdisc_xmit_lock_key gets re-registered in netdev_update_lockdep_key() on slow path, while we could still acquire the queue->_xmit_lock on fast path in this small window: CPU A CPU B __netif_tx_lock(); lockdep_unregister_key(qdisc_xmit_lock_key); __netif_tx_unlock(); lockdep_register_key(qdisc_xmit_lock_key); In fact, unlike the addr_list_lock which has to be reordered when the master/slave device relationship changes, queue->_xmit_lock is only acquired on fast path and only when NETIF_F_LLTX is not set, so there is likely no nested locking for it. Therefore, we can just get rid of re-registration of qdisc_xmit_lock_key. Reported-by: [email protected] Fixes: ab92d68 ("net: core: add generic lockdep keys") Cc: Taehee Yoo <[email protected]> Signed-off-by: Cong Wang <[email protected]> Acked-by: Taehee Yoo <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 44c23d7 commit 53d3749

File tree

1 file changed

+0
-12
lines changed

1 file changed

+0
-12
lines changed

net/core/dev.c

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9177,22 +9177,10 @@ static void netdev_unregister_lockdep_key(struct net_device *dev)
91779177

91789178
void netdev_update_lockdep_key(struct net_device *dev)
91799179
{
9180-
struct netdev_queue *queue;
9181-
int i;
9182-
9183-
lockdep_unregister_key(&dev->qdisc_xmit_lock_key);
91849180
lockdep_unregister_key(&dev->addr_list_lock_key);
9185-
9186-
lockdep_register_key(&dev->qdisc_xmit_lock_key);
91879181
lockdep_register_key(&dev->addr_list_lock_key);
91889182

91899183
lockdep_set_class(&dev->addr_list_lock, &dev->addr_list_lock_key);
9190-
for (i = 0; i < dev->num_tx_queues; i++) {
9191-
queue = netdev_get_tx_queue(dev, i);
9192-
9193-
lockdep_set_class(&queue->_xmit_lock,
9194-
&dev->qdisc_xmit_lock_key);
9195-
}
91969184
}
91979185
EXPORT_SYMBOL(netdev_update_lockdep_key);
91989186

0 commit comments

Comments
 (0)