bonding: Fix deadlock in bonding driver when using netpoll
Subsystems (3)
PATCH 1/1 bonding: Fix deadlock in bonding driver when using netpoll
The bonding driver take write locks and spin locks that are shared by the tx path in enslave processing and notification processing, If the netconsole is in use, the bonding can call printk which puts us in the netpoll tx path, if the netconsole is attached to the bonding driver, result in deadlock.
So add protection for these place, by checking the netpoll_block_tx state, we can defer the sending of the netconsole frames until a later time using the retransmit feature of netpoll_send_skb that is triggered on the return code NETDEV_TX_BUSY.
--- drivers/net/bonding/bond_main.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/net/bonding/bond_main.c +7 -0
@@ -1543,9 +1543,11 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)bond_set_carrier (bond);if (USES_PRIMARY (bond->params.mode)) { +block_netpoll_tx ();write_lock_bh (&bond->curr_slave_lock);bond_select_active_slave (bond);write_unlock_bh (&bond->curr_slave_lock); +unblock_netpoll_tx (); } pr_info("%s: enslaving %s as a%s interface with a%s link.\n",
@@ -1571,10 +1573,12 @@ err_detach:if (bond->primary_slave == new_slave) bond->primary_slave =NULL ;if (bond->curr_active_slave == new_slave) { +block_netpoll_tx ();write_lock_bh (&bond->curr_slave_lock);bond_change_active_slave (bond,NULL );bond_select_active_slave (bond);write_unlock_bh (&bond->curr_slave_lock); +unblock_netpoll_tx (); }slave_disable_netpoll (new_slave);
@@ -2864,9 +2868,12 @@ static int bond_slave_netdev_event(unsigned long event,pr_info ("%s: Primary slave changed to %s, reselecting active slave.\n" , bond->dev->name, bond->primary_slave ? slave_dev->name :"none" ); + +block_netpoll_tx ();write_lock_bh (&bond->curr_slave_lock);bond_select_active_slave (bond);write_unlock_bh (&bond->curr_slave_lock); +unblock_netpoll_tx ();break ;case NETDEV_FEAT_CHANGE :bond_compute_features (bond);
Signature · 1 line
1.8.0
From: Ding Tianhong <[email protected]>
Date: Wed, 12 Feb 2014 12:06:40 +0800
Quoted 11 lines
The bonding driver take write locks and spin locks that are shared by the tx path in enslave processing and notification processing, If the netconsole is in use, the bonding can call printk which puts us in the netpoll tx path, if the netconsole is attached to the bonding driver, result in deadlock.
So add protection for these place, by checking the
netpoll_block_txstate, we can defer the sending of the netconsole frames until a later time using the retransmit feature ofnetpoll_send_skbthat is triggered on the return codeNETDEV_TX_BUSY.
Quoted 4 lines
Cc Jay Vosburgh <[email protected]>Cc Veaceslav Falico <[email protected]>Cc Andy Gospodarek <[email protected]>Signed-off-by Ding Tianhong <[email protected]>
Applied.