[ovs-dev] [PATCH 4/4] datapath: Compact mask list array.
Pravin
pshelar at nicira.com
Mon Apr 7 22:00:39 UTC 2014
From: Pravin Shelar <pshelar at nicira.com>
Along with flow-table rehashing OVS can compact masks array. This
allows us to calculate highest index for mask array.
Signed-off-by: Pravin B Shelar <pshelar at nicira.com>
---
datapath/flow_table.c | 24 ++++++++++++++++++++----
datapath/flow_table.h | 2 +-
2 files changed, 21 insertions(+), 5 deletions(-)
diff --git a/datapath/flow_table.c b/datapath/flow_table.c
index 5665cfc..b2c0497 100644
--- a/datapath/flow_table.c
+++ b/datapath/flow_table.c
@@ -230,6 +230,7 @@ static struct mask_array *tbl_mask_array_alloc(int size)
new->count = 0;
new->max = size;
+ new->hi_index = 0;
return new;
}
@@ -252,6 +253,8 @@ static int tbl_mask_array_realloc(struct flow_table *tbl, int size)
new->masks[new->count++] = old->masks[i];
}
}
+
+ new->hi_index = new->count;
rcu_assign_pointer(tbl->mask_array, new);
if (old)
@@ -260,6 +263,17 @@ static int tbl_mask_array_realloc(struct flow_table *tbl, int size)
return 0;
}
+static void tbl_mask_array_compact(struct flow_table *tbl)
+{
+ struct mask_array *ma;
+ int size;
+
+ ma = ovsl_dereference(tbl->mask_array);
+
+ size = roundup(ma->count, MASK_ARRAY_SIZE_MIN);
+ tbl_mask_array_realloc(tbl, size);
+}
+
int ovs_flow_tbl_init(struct flow_table *table)
{
struct table_instance *ti;
@@ -521,7 +535,7 @@ static struct sw_flow *flow_lookup(struct flow_table *tbl,
int i, c;
c = 0;
- for (i = 0; i < ma->max; i++) {
+ for (i = 0; i < ma->hi_index; i++) {
struct sw_flow_mask *mask;
mask = rcu_dereference_ovsl(ma->masks[i]);
@@ -631,7 +645,7 @@ static void flow_mask_remove(struct flow_table *tbl, struct sw_flow_mask *mask)
int i;
ma = ovsl_dereference(tbl->mask_array);
- for (i = 0; i < ma->max; i++) {
+ for (i = 0; i < ma->hi_index; i++) {
if (mask == ovsl_dereference(ma->masks[i])) {
RCU_INIT_POINTER(ma->masks[i], NULL);
ma->count--;
@@ -688,7 +702,7 @@ static struct sw_flow_mask *flow_mask_find(const struct flow_table *tbl,
int i;
ma = ovsl_dereference(tbl->mask_array);
- for (i = 0; i < ma->max; i++) {
+ for (i = 0; i < ma->hi_index; i++) {
struct sw_flow_mask *t;
t = ovsl_dereference(ma->masks[i]);
@@ -736,8 +750,9 @@ static int flow_mask_insert(struct flow_table *tbl, struct sw_flow *flow,
t = ovsl_dereference(ma->masks[i]);
if (!t) {
- rcu_assign_pointer(ma->masks[i], mask);
ma->count++;
+ ma->hi_index = i + 1;
+ rcu_assign_pointer(ma->masks[i], mask);
break;
}
}
@@ -777,6 +792,7 @@ int ovs_flow_tbl_insert(struct flow_table *table, struct sw_flow *flow,
if (new_ti) {
rcu_assign_pointer(table->ti, new_ti);
table_instance_destroy(ti, true);
+ tbl_mask_array_compact(table);
table->last_rehash = jiffies;
}
return 0;
diff --git a/datapath/flow_table.h b/datapath/flow_table.h
index ee86953..cf898ba 100644
--- a/datapath/flow_table.h
+++ b/datapath/flow_table.h
@@ -43,7 +43,7 @@ struct mask_cache_entry {
struct mask_array {
struct rcu_head rcu;
- int count, max;
+ int count, max, hi_index;
struct sw_flow_mask __rcu *masks[];
};
--
1.7.9.5
More information about the dev
mailing list