bonding: Fix locking in 802.3ad mode
The 802.3ad state machine lock can be acquired in both softirq and not softirq context, but was not held at _bh to prevent a deadlock (which could occur if a LACPDU arrived and was processed while the lock was held). Corrected this, now hold the state machine lock at _bh to prevent deadlock. Bug reported by Todd Fleisher <todd@fleish.org>. Signed-off-by: Jay Vosburgh <fubar@us.ibm.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
committed by
Jeff Garzik
parent
26c080bf83
commit
2bf86b7aa8
@@ -310,7 +310,7 @@ static inline int __check_agg_selection_timer(struct port *port)
|
|||||||
*/
|
*/
|
||||||
static inline void __get_rx_machine_lock(struct port *port)
|
static inline void __get_rx_machine_lock(struct port *port)
|
||||||
{
|
{
|
||||||
spin_lock(&(SLAVE_AD_INFO(port->slave).rx_machine_lock));
|
spin_lock_bh(&(SLAVE_AD_INFO(port->slave).rx_machine_lock));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -320,7 +320,7 @@ static inline void __get_rx_machine_lock(struct port *port)
|
|||||||
*/
|
*/
|
||||||
static inline void __release_rx_machine_lock(struct port *port)
|
static inline void __release_rx_machine_lock(struct port *port)
|
||||||
{
|
{
|
||||||
spin_unlock(&(SLAVE_AD_INFO(port->slave).rx_machine_lock));
|
spin_unlock_bh(&(SLAVE_AD_INFO(port->slave).rx_machine_lock));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user