diff options
author | David S. Miller <davem@davemloft.net> | 2019-09-17 23:51:10 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-09-17 23:51:10 +0200 |
commit | 1bab8d4c488be22d57f9dd09968c90a0ddc413bf (patch) | |
tree | 81318cd13170a3b6b72489f63e92adb0eaf49693 /net/core/sock_reuseport.c | |
parent | 990925fad5c227269c3fcb76c7c46811b1e86c73 (diff) | |
parent | 00b368502d18f790ab715e055869fd4bb7484a9b (diff) | |
download | linux-1bab8d4c488be22d57f9dd09968c90a0ddc413bf.tar.bz2 |
Merge ra.kernel.org:/pub/scm/linux/kernel/git/netdev/net
Pull in bug fixes from 'net' tree for the merge window.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core/sock_reuseport.c')
-rw-r--r-- | net/core/sock_reuseport.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/net/core/sock_reuseport.c b/net/core/sock_reuseport.c index 9408f9264d05..f3ceec93f392 100644 --- a/net/core/sock_reuseport.c +++ b/net/core/sock_reuseport.c @@ -295,8 +295,19 @@ struct sock *reuseport_select_sock(struct sock *sk, select_by_hash: /* no bpf or invalid bpf result: fall back to hash usage */ - if (!sk2) - sk2 = reuse->socks[reciprocal_scale(hash, socks)]; + if (!sk2) { + int i, j; + + i = j = reciprocal_scale(hash, socks); + while (reuse->socks[i]->sk_state == TCP_ESTABLISHED) { + i++; + if (i >= reuse->num_socks) + i = 0; + if (i == j) + goto out; + } + sk2 = reuse->socks[i]; + } } out: |