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

Reply via email to