[ovs-dev] [PATCH] datapath: Allow the number of hash entries to exceed TBL_MAX_BUCKETS

Simon Horman horms at verge.net.au
Mon Aug 1 13:55:14 UTC 2011


* If the number of entries in a table exceeds
  the number of buckets that it has then
  an attempt will be made to resize the table.

* There is a limit of TBL_MAX_BUCKETS placed on
  the number of buckets of a table.

* If this limit is exceeded keep using the existing table.
  This allows a table to hold more than TBL_MAX_BUCKETS
  entries at the expense of increased hash collisions.

Signed-off-by: Simon Horman <horms at verge.net.au>

---

It appears that on 64-bit systems TBL_MAX_BUCKETS
is 131072 (128k) not 262144 (256k) as noted in
the comment with to its definition.

Without this change the number of flows that
can be present in the datapath is limited to 128k.
With this change I am able achieve significantly
higher flow counts.
---
 datapath/datapath.c |   12 +++++++-----
 datapath/tunnel.c   |   12 +++++++-----
 2 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/datapath/datapath.c b/datapath/datapath.c
index a964c27..3ec5be4 100644
--- a/datapath/datapath.c
+++ b/datapath/datapath.c
@@ -629,11 +629,13 @@ static int expand_table(struct datapath *dp)
 	struct tbl *new_table;
 
 	new_table = tbl_expand(old_table);
-	if (IS_ERR(new_table))
-		return PTR_ERR(new_table);
-
-	rcu_assign_pointer(dp->table, new_table);
-	tbl_deferred_destroy(old_table, NULL);
+	if (IS_ERR(new_table)) {
+		if (PTR_ERR(new_table) != -ENOSPC)
+			return PTR_ERR(new_table);
+	} else {
+		rcu_assign_pointer(dp->table, new_table);
+		tbl_deferred_destroy(old_table, NULL);
+	}
 
  	return 0;
 }
diff --git a/datapath/tunnel.c b/datapath/tunnel.c
index c2439f0..1ef81ab 100644
--- a/datapath/tunnel.c
+++ b/datapath/tunnel.c
@@ -249,11 +249,13 @@ static int add_port(struct vport *vport)
 		struct tbl *new_table;
 
 		new_table = tbl_expand(cur_table);
-		if (IS_ERR(new_table))
-			return PTR_ERR(new_table);
-
-		rcu_assign_pointer(port_table, new_table);
-		tbl_deferred_destroy(cur_table, NULL);
+		if (IS_ERR(new_table)) {
+			if (PTR_ERR(new_table) != -ENOSPC)
+				return PTR_ERR(new_table);
+		} else {
+			rcu_assign_pointer(port_table, new_table);
+			tbl_deferred_destroy(cur_table, NULL);
+		}
 	}
 
 	err = tbl_insert(rtnl_dereference(port_table), &tnl_vport->tbl_node,
-- 
1.7.5.4




More information about the dev mailing list