diff options
author | Tom Herbert <therbert@google.com> | 2013-12-22 18:54:31 +0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-12-31 13:31:34 -0500 |
commit | fe47755852d1f299b55a6e6594bb6e082ac103d4 (patch) | |
tree | c7b7afa5b89a92f602ec9d278d4d8d78a84039c1 | |
parent | 84a6a0acad145fb9bc11dcb60f6d064072f0cc1c (diff) | |
download | linux-stable-fe47755852d1f299b55a6e6594bb6e082ac103d4.tar.gz linux-stable-fe47755852d1f299b55a6e6594bb6e082ac103d4.tar.bz2 linux-stable-fe47755852d1f299b55a6e6594bb6e082ac103d4.zip |
net: Allow setting sock flow hash without a sock
This patch adds sock_rps_record_flow_hash and sock_rps_reset_flow_hash
which take a hash value as an argument and sets the sock_flow_table
accordingly. This allows the table to be populated in cases where flow
is being tracked outside of a sock structure.
sock_rps_record_flow and sock_rps_reset_flow call this function
where the hash is taken from sk_rxhash.
Signed-off-by: Tom Herbert <therbert@google.com>
Signed-off-by: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | include/net/sock.h | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/include/net/sock.h b/include/net/sock.h index 2ef3c3eca47a..8ee90add69d2 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -820,30 +820,40 @@ static inline int sk_backlog_rcv(struct sock *sk, struct sk_buff *skb) return sk->sk_backlog_rcv(sk, skb); } -static inline void sock_rps_record_flow(const struct sock *sk) +static inline void sock_rps_record_flow_hash(__u32 hash) { #ifdef CONFIG_RPS struct rps_sock_flow_table *sock_flow_table; rcu_read_lock(); sock_flow_table = rcu_dereference(rps_sock_flow_table); - rps_record_sock_flow(sock_flow_table, sk->sk_rxhash); + rps_record_sock_flow(sock_flow_table, hash); rcu_read_unlock(); #endif } -static inline void sock_rps_reset_flow(const struct sock *sk) +static inline void sock_rps_reset_flow_hash(__u32 hash) { #ifdef CONFIG_RPS struct rps_sock_flow_table *sock_flow_table; rcu_read_lock(); sock_flow_table = rcu_dereference(rps_sock_flow_table); - rps_reset_sock_flow(sock_flow_table, sk->sk_rxhash); + rps_reset_sock_flow(sock_flow_table, hash); rcu_read_unlock(); #endif } +static inline void sock_rps_record_flow(const struct sock *sk) +{ + sock_rps_record_flow_hash(sk->sk_rxhash); +} + +static inline void sock_rps_reset_flow(const struct sock *sk) +{ + sock_rps_reset_flow_hash(sk->sk_rxhash); +} + static inline void sock_rps_save_rxhash(struct sock *sk, const struct sk_buff *skb) { |