bonding:delete lacp_fast from ad_bond_info
These is also a bug, that if you modify lacp_rate via sysfs, and add new slaves in bonding, new slaves won't use the latest lacp_rate, since ad_bond_info->lacp_fast is initialized only once, in bond_3ad_initialize(). Since both struct bond_params and ad_bond_info have lacp_fast, they are duplicate and need extra synchronization. bond_3ad_bind_slave() can use bond_params->lacp_fast to initialize port. So we can just remove lacp_fast from struct ad_bond_info. Signed-off-by: Weiping Pan <panweiping3@gmail.com> Signed-off-by: Jay Vosburgh <fubar@us.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
ba824a8b2d
Коммит
56d00c677d
|
@ -1868,11 +1868,10 @@ static u16 aggregator_identifier;
|
||||||
* bond_3ad_initialize - initialize a bond's 802.3ad parameters and structures
|
* bond_3ad_initialize - initialize a bond's 802.3ad parameters and structures
|
||||||
* @bond: bonding struct to work on
|
* @bond: bonding struct to work on
|
||||||
* @tick_resolution: tick duration (millisecond resolution)
|
* @tick_resolution: tick duration (millisecond resolution)
|
||||||
* @lacp_fast: boolean. whether fast periodic should be used
|
|
||||||
*
|
*
|
||||||
* Can be called only after the mac address of the bond is set.
|
* Can be called only after the mac address of the bond is set.
|
||||||
*/
|
*/
|
||||||
void bond_3ad_initialize(struct bonding *bond, u16 tick_resolution, int lacp_fast)
|
void bond_3ad_initialize(struct bonding *bond, u16 tick_resolution)
|
||||||
{
|
{
|
||||||
// check that the bond is not initialized yet
|
// check that the bond is not initialized yet
|
||||||
if (MAC_ADDRESS_COMPARE(&(BOND_AD_INFO(bond).system.sys_mac_addr),
|
if (MAC_ADDRESS_COMPARE(&(BOND_AD_INFO(bond).system.sys_mac_addr),
|
||||||
|
@ -1880,7 +1879,6 @@ void bond_3ad_initialize(struct bonding *bond, u16 tick_resolution, int lacp_fas
|
||||||
|
|
||||||
aggregator_identifier = 0;
|
aggregator_identifier = 0;
|
||||||
|
|
||||||
BOND_AD_INFO(bond).lacp_fast = lacp_fast;
|
|
||||||
BOND_AD_INFO(bond).system.sys_priority = 0xFFFF;
|
BOND_AD_INFO(bond).system.sys_priority = 0xFFFF;
|
||||||
BOND_AD_INFO(bond).system.sys_mac_addr = *((struct mac_addr *)bond->dev->dev_addr);
|
BOND_AD_INFO(bond).system.sys_mac_addr = *((struct mac_addr *)bond->dev->dev_addr);
|
||||||
|
|
||||||
|
@ -1903,6 +1901,7 @@ void bond_3ad_initialize(struct bonding *bond, u16 tick_resolution, int lacp_fas
|
||||||
int bond_3ad_bind_slave(struct slave *slave)
|
int bond_3ad_bind_slave(struct slave *slave)
|
||||||
{
|
{
|
||||||
struct bonding *bond = bond_get_bond_by_slave(slave);
|
struct bonding *bond = bond_get_bond_by_slave(slave);
|
||||||
|
int lacp_fast = bond->params.lacp_fast;
|
||||||
struct port *port;
|
struct port *port;
|
||||||
struct aggregator *aggregator;
|
struct aggregator *aggregator;
|
||||||
|
|
||||||
|
@ -1918,7 +1917,7 @@ int bond_3ad_bind_slave(struct slave *slave)
|
||||||
// port initialization
|
// port initialization
|
||||||
port = &(SLAVE_AD_INFO(slave).port);
|
port = &(SLAVE_AD_INFO(slave).port);
|
||||||
|
|
||||||
ad_initialize_port(port, BOND_AD_INFO(bond).lacp_fast);
|
ad_initialize_port(port, lacp_fast);
|
||||||
|
|
||||||
port->slave = slave;
|
port->slave = slave;
|
||||||
port->actor_port_number = SLAVE_AD_INFO(slave).id;
|
port->actor_port_number = SLAVE_AD_INFO(slave).id;
|
||||||
|
|
|
@ -254,9 +254,6 @@ struct ad_bond_info {
|
||||||
struct ad_system system; /* 802.3ad system structure */
|
struct ad_system system; /* 802.3ad system structure */
|
||||||
u32 agg_select_timer; // Timer to select aggregator after all adapter's hand shakes
|
u32 agg_select_timer; // Timer to select aggregator after all adapter's hand shakes
|
||||||
u32 agg_select_mode; // Mode of selection of active aggregator(bandwidth/count)
|
u32 agg_select_mode; // Mode of selection of active aggregator(bandwidth/count)
|
||||||
int lacp_fast; /* whether fast periodic tx should be
|
|
||||||
* requested
|
|
||||||
*/
|
|
||||||
struct timer_list ad_timer;
|
struct timer_list ad_timer;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -269,7 +266,7 @@ struct ad_slave_info {
|
||||||
};
|
};
|
||||||
|
|
||||||
// ================= AD Exported functions to the main bonding code ==================
|
// ================= AD Exported functions to the main bonding code ==================
|
||||||
void bond_3ad_initialize(struct bonding *bond, u16 tick_resolution, int lacp_fast);
|
void bond_3ad_initialize(struct bonding *bond, u16 tick_resolution);
|
||||||
int bond_3ad_bind_slave(struct slave *slave);
|
int bond_3ad_bind_slave(struct slave *slave);
|
||||||
void bond_3ad_unbind_slave(struct slave *slave);
|
void bond_3ad_unbind_slave(struct slave *slave);
|
||||||
void bond_3ad_state_machine_handler(struct work_struct *);
|
void bond_3ad_state_machine_handler(struct work_struct *);
|
||||||
|
|
|
@ -1843,8 +1843,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
|
||||||
/* Initialize AD with the number of times that the AD timer is called in 1 second
|
/* Initialize AD with the number of times that the AD timer is called in 1 second
|
||||||
* can be called only after the mac address of the bond is set
|
* can be called only after the mac address of the bond is set
|
||||||
*/
|
*/
|
||||||
bond_3ad_initialize(bond, 1000/AD_TIMER_INTERVAL,
|
bond_3ad_initialize(bond, 1000/AD_TIMER_INTERVAL);
|
||||||
bond->params.lacp_fast);
|
|
||||||
} else {
|
} else {
|
||||||
SLAVE_AD_INFO(new_slave).id =
|
SLAVE_AD_INFO(new_slave).id =
|
||||||
SLAVE_AD_INFO(new_slave->prev).id + 1;
|
SLAVE_AD_INFO(new_slave->prev).id + 1;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче