bonding: rework bond_3ad_xmit_xor() to use bond_for_each_slave() only
Currently, there are two loops - first we find the first slave in an aggregator after the xmit_hash_policy() returned number, and after that we loop from that slave, over bonding head, and till that slave to find any suitable slave to send the packet through. Replace it by just one bond_for_each_slave() loop, which first loops through the requested number of slaves, saving the first suitable one, and after that we've hit the requested number of slaves to skip - search for any up slave to send the packet through. If we don't find such kind of slave - then just send the packet through the first suitable slave found. Logic remains unchainged, and we skip two loops. Also, refactor it a bit for readability. CC: Jay Vosburgh <fubar@us.ibm.com> CC: Andy Gospodarek <andy@greyhouse.net> Signed-off-by: Veaceslav Falico <vfalico@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
544a028e65
commit
c33d78874e
|
@ -2417,15 +2417,15 @@ int bond_3ad_get_active_agg_info(struct bonding *bond, struct ad_info *ad_info)
|
||||||
|
|
||||||
int bond_3ad_xmit_xor(struct sk_buff *skb, struct net_device *dev)
|
int bond_3ad_xmit_xor(struct sk_buff *skb, struct net_device *dev)
|
||||||
{
|
{
|
||||||
struct slave *slave, *start_at;
|
|
||||||
struct bonding *bond = netdev_priv(dev);
|
struct bonding *bond = netdev_priv(dev);
|
||||||
struct list_head *iter;
|
struct slave *slave, *first_ok_slave;
|
||||||
int slave_agg_no;
|
struct aggregator *agg;
|
||||||
int slaves_in_agg;
|
|
||||||
int agg_id;
|
|
||||||
int i;
|
|
||||||
struct ad_info ad_info;
|
struct ad_info ad_info;
|
||||||
|
struct list_head *iter;
|
||||||
|
int slaves_in_agg;
|
||||||
|
int slave_agg_no;
|
||||||
int res = 1;
|
int res = 1;
|
||||||
|
int agg_id;
|
||||||
|
|
||||||
read_lock(&bond->lock);
|
read_lock(&bond->lock);
|
||||||
if (__bond_3ad_get_active_agg_info(bond, &ad_info)) {
|
if (__bond_3ad_get_active_agg_info(bond, &ad_info)) {
|
||||||
|
@ -2438,20 +2438,28 @@ int bond_3ad_xmit_xor(struct sk_buff *skb, struct net_device *dev)
|
||||||
agg_id = ad_info.aggregator_id;
|
agg_id = ad_info.aggregator_id;
|
||||||
|
|
||||||
if (slaves_in_agg == 0) {
|
if (slaves_in_agg == 0) {
|
||||||
/*the aggregator is empty*/
|
|
||||||
pr_debug("%s: Error: active aggregator is empty\n", dev->name);
|
pr_debug("%s: Error: active aggregator is empty\n", dev->name);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
slave_agg_no = bond->xmit_hash_policy(skb, slaves_in_agg);
|
slave_agg_no = bond->xmit_hash_policy(skb, slaves_in_agg);
|
||||||
|
first_ok_slave = NULL;
|
||||||
|
|
||||||
bond_for_each_slave(bond, slave, iter) {
|
bond_for_each_slave(bond, slave, iter) {
|
||||||
struct aggregator *agg = SLAVE_AD_INFO(slave).port.aggregator;
|
agg = SLAVE_AD_INFO(slave).port.aggregator;
|
||||||
|
if (!agg || agg->aggregator_identifier != agg_id)
|
||||||
|
continue;
|
||||||
|
|
||||||
if (agg && (agg->aggregator_identifier == agg_id)) {
|
if (slave_agg_no >= 0) {
|
||||||
|
if (!first_ok_slave && SLAVE_IS_OK(slave))
|
||||||
|
first_ok_slave = slave;
|
||||||
slave_agg_no--;
|
slave_agg_no--;
|
||||||
if (slave_agg_no < 0)
|
continue;
|
||||||
break;
|
}
|
||||||
|
|
||||||
|
if (SLAVE_IS_OK(slave)) {
|
||||||
|
res = bond_dev_queue_xmit(bond, skb, slave->dev);
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2461,20 +2469,10 @@ int bond_3ad_xmit_xor(struct sk_buff *skb, struct net_device *dev)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
start_at = slave;
|
/* we couldn't find any suitable slave after the agg_no, so use the
|
||||||
|
* first suitable found, if found. */
|
||||||
bond_for_each_slave_from(bond, slave, i, start_at) {
|
if (first_ok_slave)
|
||||||
int slave_agg_id = 0;
|
res = bond_dev_queue_xmit(bond, skb, first_ok_slave->dev);
|
||||||
struct aggregator *agg = SLAVE_AD_INFO(slave).port.aggregator;
|
|
||||||
|
|
||||||
if (agg)
|
|
||||||
slave_agg_id = agg->aggregator_identifier;
|
|
||||||
|
|
||||||
if (SLAVE_IS_OK(slave) && agg && (slave_agg_id == agg_id)) {
|
|
||||||
res = bond_dev_queue_xmit(bond, skb, slave->dev);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
out:
|
out:
|
||||||
read_unlock(&bond->lock);
|
read_unlock(&bond->lock);
|
||||||
|
|
Loading…
Reference in New Issue