Acked-by: Jarno Rajahalme <jrajaha...@nicira.com>

On Aug 7, 2014, at 12:51 PM, Pravin B Shelar <pshe...@nicira.com> wrote:

> There are two separate API to allocate and copy actions list. Anytime
> OVS needs to copy action list, it needs to call both functions.
> Following patch moves action allocation to copy function to avoid
> code duplication.
> 
> Signed-off-by: Pravin B Shelar <pshe...@nicira.com>
> ---
> datapath/datapath.c     | 49 +++++++++----------------------------------------
> datapath/flow_netlink.c | 24 +++++++++++++++++-------
> datapath/flow_netlink.h |  1 -
> 3 files changed, 26 insertions(+), 48 deletions(-)
> 
> diff --git a/datapath/datapath.c b/datapath/datapath.c
> index 19d41c8..62e3c26 100644
> --- a/datapath/datapath.c
> +++ b/datapath/datapath.c
> @@ -569,17 +569,12 @@ static int ovs_packet_cmd_execute(struct sk_buff *skb, 
> struct genl_info *info)
>       if (err)
>               goto err_flow_free;
> 
> -     acts = ovs_nla_alloc_flow_actions(nla_len(a[OVS_PACKET_ATTR_ACTIONS]));
> -     err = PTR_ERR(acts);
> -     if (IS_ERR(acts))
> -             goto err_flow_free;
> -
>       err = ovs_nla_copy_actions(a[OVS_PACKET_ATTR_ACTIONS],
>                                  &flow->key, &acts);
> -     rcu_assign_pointer(flow->sf_acts, acts);
>       if (err)
>               goto err_flow_free;
> 
> +     rcu_assign_pointer(flow->sf_acts, acts);
>       OVS_CB(packet)->flow = flow;
>       OVS_CB(packet)->pkt_key = &flow->key;
>       OVS_CB(skb)->egress_tun_info = NULL;
> @@ -899,11 +894,6 @@ static int ovs_flow_cmd_new(struct sk_buff *skb, struct 
> genl_info *info)
>       ovs_flow_mask_key(&new_flow->key, &new_flow->unmasked_key, &mask);
> 
>       /* Validate actions. */
> -     acts = ovs_nla_alloc_flow_actions(nla_len(a[OVS_FLOW_ATTR_ACTIONS]));
> -     error = PTR_ERR(acts);
> -     if (IS_ERR(acts))
> -             goto err_kfree_flow;
> -
>       error = ovs_nla_copy_actions(a[OVS_FLOW_ATTR_ACTIONS], &new_flow->key,
>                                    &acts);
>       if (error) {
> @@ -1000,29 +990,6 @@ error:
>       return error;
> }
> 
> -static struct sw_flow_actions *get_flow_actions(const struct nlattr *a,
> -                                             const struct sw_flow_key *key,
> -                                             const struct sw_flow_mask *mask)
> -{
> -     struct sw_flow_actions *acts;
> -     struct sw_flow_key masked_key;
> -     int error;
> -
> -     acts = ovs_nla_alloc_flow_actions(nla_len(a));
> -     if (IS_ERR(acts))
> -             return acts;
> -
> -     ovs_flow_mask_key(&masked_key, key, mask);
> -     error = ovs_nla_copy_actions(a, &masked_key, &acts);
> -     if (error) {
> -             OVS_NLERR("Flow actions may not be safe on all matching 
> packets.\n");
> -             kfree(acts);
> -             return ERR_PTR(error);
> -     }
> -
> -     return acts;
> -}
> -
> static int ovs_flow_cmd_set(struct sk_buff *skb, struct genl_info *info)
> {
>       struct nlattr **a = info->attrs;
> @@ -1051,15 +1018,17 @@ static int ovs_flow_cmd_set(struct sk_buff *skb, 
> struct genl_info *info)
> 
>       /* Validate actions. */
>       if (a[OVS_FLOW_ATTR_ACTIONS]) {
> -             acts = get_flow_actions(a[OVS_FLOW_ATTR_ACTIONS], &key, &mask);
> -             if (IS_ERR(acts)) {
> -                     error = PTR_ERR(acts);
> +             struct sw_flow_key masked_key;
> +
> +             ovs_flow_mask_key(&masked_key, &key, &mask);
> +             error = ovs_nla_copy_actions(a[OVS_FLOW_ATTR_ACTIONS],
> +                                          &masked_key, &acts);
> +             if (error) {
> +                     OVS_NLERR("Flow actions may not be safe on all matching 
> packets.\n");
>                       goto error;
>               }
> -     }
> 
> -     /* Can allocate before locking if have acts. */
> -     if (acts) {
> +             /* Can allocate before locking if have acts. */
>               reply = ovs_flow_cmd_alloc_info(acts, info, false);
>               if (IS_ERR(reply)) {
>                       error = PTR_ERR(reply);
> diff --git a/datapath/flow_netlink.c b/datapath/flow_netlink.c
> index 75172de..e4cf535 100644
> --- a/datapath/flow_netlink.c
> +++ b/datapath/flow_netlink.c
> @@ -1239,7 +1239,7 @@ nla_put_failure:
> 
> #define MAX_ACTIONS_BUFSIZE   (32 * 1024)
> 
> -struct sw_flow_actions *ovs_nla_alloc_flow_actions(int size)
> +static struct sw_flow_actions *nla_alloc_flow_actions(int size)
> {
>       struct sw_flow_actions *sfa;
> 
> @@ -1293,7 +1293,7 @@ static struct nlattr *reserve_sfa_size(struct 
> sw_flow_actions **sfa,
>               new_acts_size = MAX_ACTIONS_BUFSIZE;
>       }
> 
> -     acts = ovs_nla_alloc_flow_actions(new_acts_size);
> +     acts = nla_alloc_flow_actions(new_acts_size);
>       if (IS_ERR(acts))
>               return (void *)acts;
> 
> @@ -1360,7 +1360,7 @@ static inline void add_nested_action_end(struct 
> sw_flow_actions *sfa,
>       a->nla_len = sfa->actions_len - st_offset;
> }
> 
> -static int ovs_nla_copy_actions__(const struct nlattr *attr,
> +static int __ovs_nla_copy_actions(const struct nlattr *attr,
>                                 const struct sw_flow_key *key,
>                                 int depth, struct sw_flow_actions **sfa,
>                                 __be16 eth_type, __be16 vlan_tci);
> @@ -1405,7 +1405,7 @@ static int validate_and_copy_sample(const struct nlattr 
> *attr,
>       if (st_acts < 0)
>               return st_acts;
> 
> -     err = ovs_nla_copy_actions__(actions, key, depth + 1, sfa,
> +     err = __ovs_nla_copy_actions(actions, key, depth + 1, sfa,
>                                    eth_type, vlan_tci);
>       if (err)
>               return err;
> @@ -1645,7 +1645,7 @@ static int copy_action(const struct nlattr *from,
>       return 0;
> }
> 
> -static int ovs_nla_copy_actions__(const struct nlattr *attr,
> +static int __ovs_nla_copy_actions(const struct nlattr *attr,
>                                 const struct sw_flow_key *key,
>                                 int depth, struct sw_flow_actions **sfa,
>                                 __be16 eth_type, __be16 vlan_tci)
> @@ -1794,8 +1794,18 @@ int ovs_nla_copy_actions(const struct nlattr *attr,
>                        const struct sw_flow_key *key,
>                        struct sw_flow_actions **sfa)
> {
> -     return ovs_nla_copy_actions__(attr, key, 0, sfa, key->eth.type,
> -                                   key->eth.tci);
> +     int err;
> +
> +     *sfa = nla_alloc_flow_actions(nla_len(attr));
> +     if (IS_ERR(*sfa))
> +             return PTR_ERR(*sfa);
> +
> +     err = __ovs_nla_copy_actions(attr, key, 0, sfa, key->eth.type,
> +                                  key->eth.tci);
> +     if (err)
> +             kfree(*sfa);
> +
> +     return err;
> }
> 
> static int sample_action_to_attr(const struct nlattr *attr, struct sk_buff 
> *skb)
> diff --git a/datapath/flow_netlink.h b/datapath/flow_netlink.h
> index 16da264..8ac40b5 100644
> --- a/datapath/flow_netlink.h
> +++ b/datapath/flow_netlink.h
> @@ -54,7 +54,6 @@ int ovs_nla_copy_actions(const struct nlattr *attr,
> int ovs_nla_put_actions(const struct nlattr *attr,
>                       int len, struct sk_buff *skb);
> 
> -struct sw_flow_actions *ovs_nla_alloc_flow_actions(int actions_len);
> void ovs_nla_free_flow_actions(struct sw_flow_actions *);
> 
> #endif /* flow_netlink.h */
> -- 
> 1.9.3
> 
> _______________________________________________
> 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