From: Jesse Gross Date: Tue, 30 Oct 2012 23:34:50 +0000 (-0700) Subject: datapath: Remove flow refcount functionality. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9321954ac2ed1bdb5a397e2fab7ce591f9d883a9;p=openvswitch datapath: Remove flow refcount functionality. 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 Acked-by: Pravin B Shelar --- diff --git a/datapath/datapath.c b/datapath/datapath.c index 9c253e1c..e88b1da2 100644 --- a/datapath/datapath.c +++ b/datapath/datapath.c @@ -788,20 +788,20 @@ static int ovs_packet_cmd_execute(struct sk_buff *skb, struct genl_info *info) err = ovs_flow_extract(packet, -1, &flow->key, &key_len); if (err) - goto err_flow_put; + goto err_flow_free; err = ovs_flow_metadata_from_nlattrs(flow, key_len, a[OVS_PACKET_ATTR_KEY]); if (err) - goto err_flow_put; + goto err_flow_free; err = validate_actions(a[OVS_PACKET_ATTR_ACTIONS], &flow->key, 0); if (err) - goto err_flow_put; + goto err_flow_free; acts = ovs_flow_actions_alloc(a[OVS_PACKET_ATTR_ACTIONS]); err = PTR_ERR(acts); if (IS_ERR(acts)) - goto err_flow_put; + goto err_flow_free; rcu_assign_pointer(flow->sf_acts, acts); OVS_CB(packet)->flow = flow; @@ -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); +err_flow_free: + ovs_flow_free(flow); 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 44e71e62..de42acea 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 f4ef2853..8bc6db6f 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 *);