From: pravin shelar <pshe...@ovn.org>

Upstream commit:

    commit 2279994d07ab67ff7a1d09bfbd65588332dfb6d8
    Author: pravin shelar <pshe...@ovn.org>
    Date:   Mon Sep 19 13:51:00 2016 -0700

    openvswitch: avoid resetting flow key while installing new flow.

    since commit commit db74a3335e0f6 ("openvswitch: use percpu
    flow stats") flow alloc resets flow-key. So there is no need
    to reset the flow-key again if OVS is using newly allocated
    flow-key.

    Signed-off-by: Pravin B Shelar <pshe...@ovn.org>
    Signed-off-by: David S. Miller <da...@davemloft.net>
    Signed-off-by: Jarno Rajahalme <ja...@ovn.org>

Signed-off-by: Jarno Rajahalme <ja...@ovn.org>
---
 datapath/datapath.c     | 8 ++++----
 datapath/flow.c         | 2 --
 datapath/flow_netlink.c | 6 ++++--
 datapath/flow_netlink.h | 3 ++-
 4 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/datapath/datapath.c b/datapath/datapath.c
index e4089ef..be433ba 100644
--- a/datapath/datapath.c
+++ b/datapath/datapath.c
@@ -966,7 +966,7 @@ static int ovs_flow_cmd_new(struct sk_buff *skb, struct 
genl_info *info)
        }
 
        /* Extract key. */
-       ovs_match_init(&match, &new_flow->key, &mask);
+       ovs_match_init(&match, &new_flow->key, false, &mask);
        error = ovs_nla_get_match(net, &match, a[OVS_FLOW_ATTR_KEY],
                                  a[OVS_FLOW_ATTR_MASK], log);
        if (error)
@@ -1135,7 +1135,7 @@ static int ovs_flow_cmd_set(struct sk_buff *skb, struct 
genl_info *info)
 
        ufid_present = ovs_nla_get_ufid(&sfid, a[OVS_FLOW_ATTR_UFID], log);
        if (a[OVS_FLOW_ATTR_KEY]) {
-               ovs_match_init(&match, &key, &mask);
+               ovs_match_init(&match, &key, true, &mask);
                error = ovs_nla_get_match(net, &match, a[OVS_FLOW_ATTR_KEY],
                                          a[OVS_FLOW_ATTR_MASK], log);
        } else if (!ufid_present) {
@@ -1252,7 +1252,7 @@ static int ovs_flow_cmd_get(struct sk_buff *skb, struct 
genl_info *info)
 
        ufid_present = ovs_nla_get_ufid(&ufid, a[OVS_FLOW_ATTR_UFID], log);
        if (a[OVS_FLOW_ATTR_KEY]) {
-               ovs_match_init(&match, &key, NULL);
+               ovs_match_init(&match, &key, true, NULL);
                err = ovs_nla_get_match(net, &match, a[OVS_FLOW_ATTR_KEY], NULL,
                                        log);
        } else if (!ufid_present) {
@@ -1311,7 +1311,7 @@ static int ovs_flow_cmd_del(struct sk_buff *skb, struct 
genl_info *info)
 
        ufid_present = ovs_nla_get_ufid(&ufid, a[OVS_FLOW_ATTR_UFID], log);
        if (a[OVS_FLOW_ATTR_KEY]) {
-               ovs_match_init(&match, &key, NULL);
+               ovs_match_init(&match, &key, true, NULL);
                err = ovs_nla_get_match(net, &match, a[OVS_FLOW_ATTR_KEY],
                                        NULL, log);
                if (unlikely(err))
diff --git a/datapath/flow.c b/datapath/flow.c
index 58b0e13..d6d0556 100644
--- a/datapath/flow.c
+++ b/datapath/flow.c
@@ -736,8 +736,6 @@ int ovs_flow_key_extract_userspace(struct net *net, const 
struct nlattr *attr,
 {
        int err;
 
-       memset(key, 0, OVS_SW_FLOW_KEY_METADATA_SIZE);
-
        /* Extract metadata from netlink attributes. */
        err = ovs_nla_get_flow_metadata(net, attr, key, log);
        if (err)
diff --git a/datapath/flow_netlink.c b/datapath/flow_netlink.c
index 0f32664..61ae396 100644
--- a/datapath/flow_netlink.c
+++ b/datapath/flow_netlink.c
@@ -1884,13 +1884,15 @@ static int validate_and_copy_sample(struct net *net, 
const struct nlattr *attr,
 
 void ovs_match_init(struct sw_flow_match *match,
                    struct sw_flow_key *key,
+                   bool reset_key,
                    struct sw_flow_mask *mask)
 {
        memset(match, 0, sizeof(*match));
        match->key = key;
        match->mask = mask;
 
-       memset(key, 0, sizeof(*key));
+       if (reset_key)
+               memset(key, 0, sizeof(*key));
 
        if (mask) {
                memset(&mask->key, 0, sizeof(mask->key));
@@ -1937,7 +1939,7 @@ static int validate_and_copy_set_tun(const struct nlattr 
*attr,
        struct nlattr *a;
        int err = 0, start, opts_type;
 
-       ovs_match_init(&match, &key, NULL);
+       ovs_match_init(&match, &key, true, NULL);
        opts_type = ip_tun_from_nlattr(nla_data(attr), &match, false, log);
        if (opts_type < 0)
                return opts_type;
diff --git a/datapath/flow_netlink.h b/datapath/flow_netlink.h
index 1c4208b..f837e7c 100644
--- a/datapath/flow_netlink.h
+++ b/datapath/flow_netlink.h
@@ -41,7 +41,8 @@ size_t ovs_tun_key_attr_size(void);
 size_t ovs_key_attr_size(void);
 
 void ovs_match_init(struct sw_flow_match *match,
-                   struct sw_flow_key *key, struct sw_flow_mask *mask);
+                   struct sw_flow_key *key, bool reset_key,
+                   struct sw_flow_mask *mask);
 
 int ovs_nla_put_key(const struct sw_flow_key *, const struct sw_flow_key *,
                    int attr, bool is_mask, struct sk_buff *);
-- 
2.1.4

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to