Messages in this thread Patch in this message | | | From | Eddy Tao <> | Subject | [PATCH net-next v1 1/1] net: openvswitch: remove unnecessary vlan init in key_extract | Date | Tue, 7 Feb 2023 12:31:33 +0800 |
| |
Redefine clear_vlan to initialize one struct vlan_head Define clear_vlans to initialize key.eth.vlan and key.eth.cvlan Calls the revised functions accurately
Reasoning:
For vlan packet, current code calls clear_vlan unnecessarily, since parse_vlan sets key->eth.vlan and key->eth.cvlan correctly. Only special case where return value <=0 needs inialization certail key.eth.vlan or key.eth.cvlan specifically.
For none-vlan case, parse_vlan returns on the first parse_vlan_tag which returns 0, in this case, calls clear_vlan
For MAC_PROTO_NONE, logic is intact after this revision
Signed-off-by: Eddy Tao <taoyuan_eddy@hotmail.com> --- net/openvswitch/flow.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-)
diff --git a/net/openvswitch/flow.c b/net/openvswitch/flow.c index e20d1a973417..30a90597cab6 100644 --- a/net/openvswitch/flow.c +++ b/net/openvswitch/flow.c @@ -480,12 +480,16 @@ static int parse_vlan_tag(struct sk_buff *skb, struct vlan_head *key_vh, return 1; } -static void clear_vlan(struct sw_flow_key *key) +static inline void clear_vlan(struct vlan_head *vlan) { - key->eth.vlan.tci = 0; - key->eth.vlan.tpid = 0; - key->eth.cvlan.tci = 0; - key->eth.cvlan.tpid = 0; + vlan->tci = 0; + vlan->tpid = 0; +} + +static inline void clear_vlans(struct sw_flow_key *key) +{ + clear_vlan(&key->eth.vlan); + clear_vlan(&key->eth.cvlan); } static int parse_vlan(struct sk_buff *skb, struct sw_flow_key *key) @@ -498,14 +502,18 @@ static int parse_vlan(struct sk_buff *skb, struct sw_flow_key *key) } else { /* Parse outer vlan tag in the non-accelerated case. */ res = parse_vlan_tag(skb, &key->eth.vlan, true); - if (res <= 0) + if (res <= 0) { + clear_vlans(key); return res; + } } /* Parse inner vlan tag. */ res = parse_vlan_tag(skb, &key->eth.cvlan, false); - if (res <= 0) + if (res <= 0) { + clear_vlan(&key->eth.cvlan); return res; + } return 0; } @@ -918,8 +926,8 @@ static int key_extract(struct sk_buff *skb, struct sw_flow_key *key) skb_reset_mac_header(skb); /* Link layer. */ - clear_vlan(key); if (ovs_key_mac_proto(key) == MAC_PROTO_NONE) { + clear_vlans(key); if (unlikely(eth_type_vlan(skb->protocol))) return -EINVAL; -- 2.27.0
| |