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