On Mon, Nov 5, 2012 at 3:50 PM, Jesse Gross <[email protected]> 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 <[email protected]> > --- > 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 <[email protected]> > _______________________________________________ > dev mailing list > [email protected] > http://openvswitch.org/mailman/listinfo/dev >
_______________________________________________ dev mailing list [email protected] http://openvswitch.org/mailman/listinfo/dev
