Thanks for the review, pushed to master, Jarno
On Mar 28, 2014, at 1:25 PM, Pravin Shelar <pshe...@nicira.com> wrote: > On Tue, Mar 25, 2014 at 2:35 PM, Jarno Rajahalme <jrajaha...@nicira.com> > wrote: >> Masks are inserted when flows are inserted to the table, so it is >> logical to correspondingly remove masks when flows are removed from >> the table, in ovs_flow_table_remove(). >> >> This allows later patches to relax the locking requirements of >> ovs_flow_free(). >> >> Signed-off-by: Jarno Rajahalme <jrajaha...@nicira.com> > > LGTM > Acked-by: Pravin B Shelar <pshe...@nicira.com> > >> --- >> datapath/flow_table.c | 43 ++++++++++++++++++++++++------------------- >> 1 file changed, 24 insertions(+), 19 deletions(-) >> >> diff --git a/datapath/flow_table.c b/datapath/flow_table.c >> index 54a2e25..a680895 100644 >> --- a/datapath/flow_table.c >> +++ b/datapath/flow_table.c >> @@ -168,25 +168,6 @@ void ovs_flow_free(struct sw_flow *flow, bool deferred) >> if (!flow) >> return; >> >> - if (flow->mask) { >> - struct sw_flow_mask *mask = flow->mask; >> - >> - /* ovs-lock is required to protect mask-refcount and >> - * mask list. >> - */ >> - ASSERT_OVSL(); >> - BUG_ON(!mask->ref_count); >> - mask->ref_count--; >> - >> - if (!mask->ref_count) { >> - list_del_rcu(&mask->list); >> - if (deferred) >> - call_rcu(&mask->rcu, >> rcu_free_sw_flow_mask_cb); >> - else >> - kfree(mask); >> - } >> - } >> - >> if (deferred) >> call_rcu(&flow->rcu, rcu_free_flow_callback); >> else >> @@ -500,6 +481,25 @@ static struct table_instance >> *table_instance_expand(struct table_instance *ti) >> return table_instance_rehash(ti, ti->n_buckets * 2); >> } >> >> +/* Remove 'mask' from the mask list, if it is not needed any more. */ >> +static void flow_mask_remove(struct flow_table *tbl, struct sw_flow_mask >> *mask) >> +{ >> + if (mask) { >> + /* ovs-lock is required to protect mask-refcount and >> + * mask list. >> + */ >> + ASSERT_OVSL(); >> + BUG_ON(!mask->ref_count); >> + mask->ref_count--; >> + >> + if (!mask->ref_count) { >> + list_del_rcu(&mask->list); >> + call_rcu(&mask->rcu, rcu_free_sw_flow_mask_cb); >> + } >> + } >> +} >> + >> +/* Must be called with OVS mutex held. */ >> void ovs_flow_tbl_remove(struct flow_table *table, struct sw_flow *flow) >> { >> struct table_instance *ti = ovsl_dereference(table->ti); >> @@ -507,6 +507,10 @@ void ovs_flow_tbl_remove(struct flow_table *table, >> struct sw_flow *flow) >> BUG_ON(table->count == 0); >> hlist_del_rcu(&flow->hash_node[ti->node_ver]); >> table->count--; >> + >> + /* RCU delete the mask. 'flow->mask' is not NULLed, as it should be >> + * accessible as long as the RCU read lock is held. */ >> + flow_mask_remove(table, flow->mask); >> } >> >> static struct sw_flow_mask *mask_alloc(void) >> @@ -569,6 +573,7 @@ static int flow_mask_insert(struct flow_table *tbl, >> struct sw_flow *flow, >> return 0; >> } >> >> +/* Must be called with OVS mutex held. */ >> int ovs_flow_tbl_insert(struct flow_table *table, struct sw_flow *flow, >> struct sw_flow_mask *mask) >> { >> -- >> 1.7.10.4 >> >> _______________________________________________ >> dev mailing list >> dev@openvswitch.org >> http://openvswitch.org/mailman/listinfo/dev
_______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev