[ovs-dev] [PATCH] datapath: Remove flow refcount functionality.

Pravin Shelar pshelar at nicira.com
Tue Nov 6 01:51:01 UTC 2012


On Mon, Nov 5, 2012 at 3:50 PM, Jesse Gross <jesse at nicira.com> wrote:

> Header caching previously required the ability to maintain the lifetime
> of flows across RCU boundaries.  However, now that header caching is
> gone we can simplfy the code and make it match the upstream version.
>
> Signed-off-by: Jesse Gross <jesse at nicira.com>
> ---
>  datapath/datapath.c |    6 +++---
>  datapath/flow.c     |   38 +++++++++++---------------------------
>  datapath/flow.h     |    7 +------
>  3 files changed, 15 insertions(+), 36 deletions(-)
>
> diff --git a/datapath/datapath.c b/datapath/datapath.c
> index 9c253e1..976a5f2 100644
> --- a/datapath/datapath.c
> +++ b/datapath/datapath.c
> @@ -818,13 +818,13 @@ static int ovs_packet_cmd_execute(struct sk_buff
> *skb, struct genl_info *info)
>         local_bh_enable();
>         rcu_read_unlock();
>
> -       ovs_flow_put(flow);
> +       ovs_flow_free(flow);
>         return err;
>
>  err_unlock:
>         rcu_read_unlock();
>  err_flow_put:
> -       ovs_flow_put(flow);
> +       ovs_flow_free(flow);
>

In upstream OVS label is err_flow_free.



>  err_kfree_skb:
>         kfree_skb(packet);
>  err:
> @@ -1139,7 +1139,7 @@ static int ovs_flow_cmd_new_or_set(struct sk_buff
> *skb, struct genl_info *info)
>         return 0;
>
>  error_free_flow:
> -       ovs_flow_put(flow);
> +       ovs_flow_free(flow);
>  error:
>         return error;
>  }
> diff --git a/datapath/flow.c b/datapath/flow.c
> index 44e71e6..de42ace 100644
> --- a/datapath/flow.c
> +++ b/datapath/flow.c
> @@ -226,9 +226,7 @@ struct sw_flow *ovs_flow_alloc(void)
>                 return ERR_PTR(-ENOMEM);
>
>         spin_lock_init(&flow->lock);
> -       atomic_set(&flow->refcnt, 1);
>         flow->sf_acts = NULL;
> -       flow->dead = false;
>
>         return flow;
>  }
> @@ -290,12 +288,6 @@ struct flow_table *ovs_flow_tbl_alloc(int new_size)
>         return table;
>  }
>
> -static void flow_free(struct sw_flow *flow)
> -{
> -       flow->dead = true;
> -       ovs_flow_put(flow);
> -}
> -
>  void ovs_flow_tbl_destroy(struct flow_table *table)
>  {
>         int i;
> @@ -314,7 +306,7 @@ void ovs_flow_tbl_destroy(struct flow_table *table)
>
>                 hlist_for_each_entry_safe(flow, node, n, head,
> hash_node[ver]) {
>                         hlist_del_rcu(&flow->hash_node[ver]);
> -                       flow_free(flow);
> +                       ovs_flow_free(flow);
>                 }
>         }
>
> @@ -418,13 +410,21 @@ struct flow_table *ovs_flow_tbl_expand(struct
> flow_table *table)
>         return __flow_tbl_rehash(table, table->n_buckets * 2);
>  }
>
> +void ovs_flow_free(struct sw_flow *flow)
> +{
> +       if (unlikely(!flow))
> +               return;
> +
> +       kfree((struct sf_flow_acts __force *)flow->sf_acts);
> +       kmem_cache_free(flow_cache, flow);
> +}
> +
>  /* RCU callback used by ovs_flow_deferred_free. */
>  static void rcu_free_flow_callback(struct rcu_head *rcu)
>  {
>         struct sw_flow *flow = container_of(rcu, struct sw_flow, rcu);
>
> -       flow->dead = true;
> -       ovs_flow_put(flow);
> +       ovs_flow_free(flow);
>  }
>
>  /* Schedules 'flow' to be freed after the next RCU grace period.
> @@ -434,22 +434,6 @@ void ovs_flow_deferred_free(struct sw_flow *flow)
>         call_rcu(&flow->rcu, rcu_free_flow_callback);
>  }
>
> -void ovs_flow_hold(struct sw_flow *flow)
> -{
> -       atomic_inc(&flow->refcnt);
> -}
> -
> -void ovs_flow_put(struct sw_flow *flow)
> -{
> -       if (unlikely(!flow))
> -               return;
> -
> -       if (atomic_dec_and_test(&flow->refcnt)) {
> -               kfree((struct sf_flow_acts __force *)flow->sf_acts);
> -               kmem_cache_free(flow_cache, flow);
> -       }
> -}
> -
>  /* RCU callback used by ovs_flow_deferred_free_acts. */
>  static void rcu_free_acts_callback(struct rcu_head *rcu)
>  {
> diff --git a/datapath/flow.h b/datapath/flow.h
> index f4ef285..8bc6db6 100644
> --- a/datapath/flow.h
> +++ b/datapath/flow.h
> @@ -104,9 +104,6 @@ struct sw_flow {
>         struct sw_flow_key key;
>         struct sw_flow_actions __rcu *sf_acts;
>
> -       atomic_t refcnt;
> -       bool dead;
> -
>         spinlock_t lock;        /* Lock for values below. */
>         unsigned long used;     /* Last used time (in jiffies). */
>         u64 packet_count;       /* Number of packets matched. */
> @@ -133,13 +130,11 @@ void ovs_flow_exit(void);
>
>  struct sw_flow *ovs_flow_alloc(void);
>  void ovs_flow_deferred_free(struct sw_flow *);
> +void ovs_flow_free(struct sw_flow *);
>
>  struct sw_flow_actions *ovs_flow_actions_alloc(const struct nlattr *);
>  void ovs_flow_deferred_free_acts(struct sw_flow_actions *);
>
> -void ovs_flow_hold(struct sw_flow *);
> -void ovs_flow_put(struct sw_flow *);
> -
>  int ovs_flow_extract(struct sk_buff *, u16 in_port, struct sw_flow_key *,
>                      int *key_lenp);
>  void ovs_flow_used(struct sw_flow *, struct sk_buff *);
> --
> 1.7.9.5
>
> otherwise looks good.
Acked-by: Pravin B Shelar <pshelar at nicira.com>


> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openvswitch.org/pipermail/ovs-dev/attachments/20121105/4ec7bcf0/attachment-0003.html>


More information about the dev mailing list