# [ovs-dev] [PATCH 1/3] bond: Change rebalance ratio to be more fair

Zoltan Kiss zoltan.kiss at citrix.com
Mon Jan 7 22:47:51 UTC 2013

```The old algorithm tries to converge to 0, despite it would mean a very
unbalanced situation. We're aiming for an ideal ratio of 1, meaning both
the 'from' and 'to' slave have the same load.  Therefore, we only move an
entry if it decreases the load on from, and brings us closer to equal

Signed-off-by: Zoltan Kiss <zoltan.kiss at citrix.com>
---
lib/bond.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/lib/bond.c b/lib/bond.c
index 2c59f9d..28f107a 100644
--- a/lib/bond.c
+++ b/lib/bond.c
@@ -21,6 +21,7 @@
#include <limits.h>
#include <stdint.h>
#include <stdlib.h>
+#include <math.h>

#include "coverage.h"
#include "dynamic-string.h"
@@ -771,8 +772,12 @@ choose_entry_to_migrate(const struct bond_slave *from, uint64_t to_tx_bytes)
delta = e->tx_bytes;
old_ratio = (double)from->tx_bytes / to_tx_bytes;
new_ratio = (double)(from->tx_bytes - delta) / (to_tx_bytes + delta);
-        if (old_ratio - new_ratio > 0.1) {
-            /* Would decrease the ratio, move it. */
+        if ( (old_ratio - new_ratio > 0.1) &&
+             (fabs(new_ratio-1) < fabs(old_ratio-1)) ) {
+            /* We're aiming for an ideal ratio of 1, meaning both the 'from'
+               and 'to' slave have the same load.  Therefore, we only move an
+               entry if it decreases the load on from, and brings us closer
+               to equal traffic load. */
return e;
}
}
--
1.8.0

```