tun.c changed from skb_get_hash() to __skb_get_hash_symmetric() on commit feec084a7cf4 ("tun: use symmetric hash"), which exposes an overhead for OVS datapath, where ovs_dp_process_packet() has to calculate the hash again because __skb_get_hash_symmetric() does not retain the hash that it calculates. Save the computed hash in __skb_get_hash_symmetric_net() so that the calcuation work does not go to waste. Fixes: feec084a7cf4 ("tun: use symmetric hash") Signed-off-by: Jon Kohler --- include/linux/skbuff.h | 4 ++-- net/core/flow_dissector.c | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index ff90281ddf90..f58afa49a50e 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -1568,9 +1568,9 @@ __skb_set_sw_hash(struct sk_buff *skb, __u32 hash, bool is_l4) __skb_set_hash(skb, hash, true, is_l4); } -u32 __skb_get_hash_symmetric_net(const struct net *net, const struct sk_buff *skb); +u32 __skb_get_hash_symmetric_net(const struct net *net, struct sk_buff *skb); -static inline u32 __skb_get_hash_symmetric(const struct sk_buff *skb) +static inline u32 __skb_get_hash_symmetric(struct sk_buff *skb) { return __skb_get_hash_symmetric_net(NULL, skb); } diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c index 1b61bb25ba0e..4a74dcc4799c 100644 --- a/net/core/flow_dissector.c +++ b/net/core/flow_dissector.c @@ -1864,9 +1864,10 @@ EXPORT_SYMBOL(make_flow_keys_digest); static struct flow_dissector flow_keys_dissector_symmetric __read_mostly; -u32 __skb_get_hash_symmetric_net(const struct net *net, const struct sk_buff *skb) +u32 __skb_get_hash_symmetric_net(const struct net *net, struct sk_buff *skb) { struct flow_keys keys; + u32 flow_hash; __flow_hash_secret_init(); @@ -1874,7 +1875,9 @@ u32 __skb_get_hash_symmetric_net(const struct net *net, const struct sk_buff *sk __skb_flow_dissect(net, skb, &flow_keys_dissector_symmetric, &keys, NULL, 0, 0, 0, 0); - return __flow_hash_from_keys(&keys, &hashrnd); + flow_hash = __flow_hash_from_keys(&keys, &hashrnd); + __skb_set_sw_hash(skb, flow_hash, flow_keys_have_l4(&keys)); + return flow_hash; } EXPORT_SYMBOL_GPL(__skb_get_hash_symmetric_net); -- 2.43.0