* 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 <[email protected]>

---

Without this change I have observed on a 64-bit system that the number of
entries in the flow table stops growing at 262,144 (TBL_MAX_BUCKETS).
With this change present I have observed significantly higher number
of entries present in the flow table.
---
 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 7353a7b..05ad342 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

_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev

Reply via email to