Skip to content

Commit

Permalink
bonding: optimize tlb_get_least_loaded_slave
Browse files Browse the repository at this point in the history
In the worst case, when the first loop breaks an the end of the slave list,
the slave list is iterated through twice. This patch reduces this
function only to one loop. Also makes it simpler.

Signed-off-by: Jiri Pirko <jpirko@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Jiri Pirko authored and David S. Miller committed Jun 2, 2010
1 parent 5206e24 commit 097811b
Showing 1 changed file with 13 additions and 20 deletions.
33 changes: 13 additions & 20 deletions drivers/net/bonding/bond_alb.c
Original file line number Diff line number Diff line change
Expand Up @@ -233,34 +233,27 @@ static void tlb_deinitialize(struct bonding *bond)
_unlock_tx_hashtbl(bond);
}

static long long compute_gap(struct slave *slave)
{
return (s64) (slave->speed << 20) - /* Convert to Megabit per sec */
(s64) (SLAVE_TLB_INFO(slave).load << 3); /* Bytes to bits */
}

/* Caller must hold bond lock for read */
static struct slave *tlb_get_least_loaded_slave(struct bonding *bond)
{
struct slave *slave, *least_loaded;
s64 max_gap;
int i, found = 0;

/* Find the first enabled slave */
bond_for_each_slave(bond, slave, i) {
if (SLAVE_IS_OK(slave)) {
found = 1;
break;
}
}

if (!found) {
return NULL;
}
long long max_gap;
int i;

least_loaded = slave;
max_gap = (s64)(slave->speed << 20) - /* Convert to Megabit per sec */
(s64)(SLAVE_TLB_INFO(slave).load << 3); /* Bytes to bits */
least_loaded = NULL;
max_gap = LLONG_MIN;

/* Find the slave with the largest gap */
bond_for_each_slave_from(bond, slave, i, least_loaded) {
bond_for_each_slave(bond, slave, i) {
if (SLAVE_IS_OK(slave)) {
s64 gap = (s64)(slave->speed << 20) -
(s64)(SLAVE_TLB_INFO(slave).load << 3);
long long gap = compute_gap(slave);

if (max_gap < gap) {
least_loaded = slave;
max_gap = gap;
Expand Down

0 comments on commit 097811b

Please sign in to comment.