Commit a3b18ddb authored by Tom Herbert's avatar Tom Herbert Committed by David S. Miller

net: Only do flow_dissector hash computation once per packet

Add sw_hash flag to skbuff to indicate that skb->hash was computed
from flow_dissector. This flag is checked in skb_get_hash to avoid
repeatedly trying to compute the hash (ie. in the case that no L4 hash
can be computed).
Signed-off-by: default avatarTom Herbert <therbert@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent cb1ce2ef
...@@ -455,6 +455,7 @@ static inline u32 skb_mstamp_us_delta(const struct skb_mstamp *t1, ...@@ -455,6 +455,7 @@ static inline u32 skb_mstamp_us_delta(const struct skb_mstamp *t1,
* @ooo_okay: allow the mapping of a socket to a queue to be changed * @ooo_okay: allow the mapping of a socket to a queue to be changed
* @l4_hash: indicate hash is a canonical 4-tuple hash over transport * @l4_hash: indicate hash is a canonical 4-tuple hash over transport
* ports. * ports.
* @sw_hash: indicates hash was computed in software stack
* @wifi_acked_valid: wifi_acked was set * @wifi_acked_valid: wifi_acked was set
* @wifi_acked: whether frame was acked on wifi or not * @wifi_acked: whether frame was acked on wifi or not
* @no_fcs: Request NIC to treat last 4 bytes as Ethernet FCS * @no_fcs: Request NIC to treat last 4 bytes as Ethernet FCS
...@@ -562,6 +563,7 @@ struct sk_buff { ...@@ -562,6 +563,7 @@ struct sk_buff {
__u8 pfmemalloc:1; __u8 pfmemalloc:1;
__u8 ooo_okay:1; __u8 ooo_okay:1;
__u8 l4_hash:1; __u8 l4_hash:1;
__u8 sw_hash:1;
__u8 wifi_acked_valid:1; __u8 wifi_acked_valid:1;
__u8 wifi_acked:1; __u8 wifi_acked:1;
__u8 no_fcs:1; __u8 no_fcs:1;
...@@ -575,7 +577,7 @@ struct sk_buff { ...@@ -575,7 +577,7 @@ struct sk_buff {
__u8 encap_hdr_csum:1; __u8 encap_hdr_csum:1;
__u8 csum_valid:1; __u8 csum_valid:1;
__u8 csum_complete_sw:1; __u8 csum_complete_sw:1;
/* 3/5 bit hole (depending on ndisc_nodetype presence) */ /* 2/4 bit hole (depending on ndisc_nodetype presence) */
kmemcheck_bitfield_end(flags2); kmemcheck_bitfield_end(flags2);
#if defined CONFIG_NET_DMA || defined CONFIG_NET_RX_BUSY_POLL #if defined CONFIG_NET_DMA || defined CONFIG_NET_RX_BUSY_POLL
...@@ -830,13 +832,14 @@ static inline void ...@@ -830,13 +832,14 @@ static inline void
skb_set_hash(struct sk_buff *skb, __u32 hash, enum pkt_hash_types type) skb_set_hash(struct sk_buff *skb, __u32 hash, enum pkt_hash_types type)
{ {
skb->l4_hash = (type == PKT_HASH_TYPE_L4); skb->l4_hash = (type == PKT_HASH_TYPE_L4);
skb->sw_hash = 0;
skb->hash = hash; skb->hash = hash;
} }
void __skb_get_hash(struct sk_buff *skb); void __skb_get_hash(struct sk_buff *skb);
static inline __u32 skb_get_hash(struct sk_buff *skb) static inline __u32 skb_get_hash(struct sk_buff *skb)
{ {
if (!skb->l4_hash) if (!skb->l4_hash && !skb->sw_hash)
__skb_get_hash(skb); __skb_get_hash(skb);
return skb->hash; return skb->hash;
...@@ -850,6 +853,7 @@ static inline __u32 skb_get_hash_raw(const struct sk_buff *skb) ...@@ -850,6 +853,7 @@ static inline __u32 skb_get_hash_raw(const struct sk_buff *skb)
static inline void skb_clear_hash(struct sk_buff *skb) static inline void skb_clear_hash(struct sk_buff *skb)
{ {
skb->hash = 0; skb->hash = 0;
skb->sw_hash = 0;
skb->l4_hash = 0; skb->l4_hash = 0;
} }
...@@ -862,6 +866,7 @@ static inline void skb_clear_hash_if_not_l4(struct sk_buff *skb) ...@@ -862,6 +866,7 @@ static inline void skb_clear_hash_if_not_l4(struct sk_buff *skb)
static inline void skb_copy_hash(struct sk_buff *to, const struct sk_buff *from) static inline void skb_copy_hash(struct sk_buff *to, const struct sk_buff *from)
{ {
to->hash = from->hash; to->hash = from->hash;
to->sw_hash = from->sw_hash;
to->l4_hash = from->l4_hash; to->l4_hash = from->l4_hash;
}; };
......
...@@ -256,6 +256,8 @@ void __skb_get_hash(struct sk_buff *skb) ...@@ -256,6 +256,8 @@ void __skb_get_hash(struct sk_buff *skb)
if (keys.ports) if (keys.ports)
skb->l4_hash = 1; skb->l4_hash = 1;
skb->sw_hash = 1;
skb->hash = __flow_hash_from_keys(&keys); skb->hash = __flow_hash_from_keys(&keys);
} }
EXPORT_SYMBOL(__skb_get_hash); EXPORT_SYMBOL(__skb_get_hash);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment