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