diff options
author | Eric Dumazet <eric.dumazet@gmail.com> | 2009-11-09 00:26:33 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-11-10 23:54:38 -0500 |
commit | 30fff9231fad757c061285e347b33c5149c2c2e4 (patch) | |
tree | 79d07aba4b8de4367090442292e412d1ccf961ef /include | |
parent | 0ab365f463b9c5c8b76476a1808dfde1c38f6f19 (diff) |
udp: bind() optimisation
UDP bind() can be O(N^2) in some pathological cases.
Thanks to secondary hash tables, we can make it O(N)
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/udp.h | 6 | ||||
-rw-r--r-- | include/net/udp.h | 3 |
2 files changed, 8 insertions, 1 deletions
diff --git a/include/linux/udp.h b/include/linux/udp.h index 59f0ddf2d284..03f72a2ba028 100644 --- a/include/linux/udp.h +++ b/include/linux/udp.h | |||
@@ -88,6 +88,12 @@ static inline struct udp_sock *udp_sk(const struct sock *sk) | |||
88 | return (struct udp_sock *)sk; | 88 | return (struct udp_sock *)sk; |
89 | } | 89 | } |
90 | 90 | ||
91 | #define udp_portaddr_for_each_entry(__sk, node, list) \ | ||
92 | hlist_nulls_for_each_entry(__sk, node, list, __sk_common.skc_portaddr_node) | ||
93 | |||
94 | #define udp_portaddr_for_each_entry_rcu(__sk, node, list) \ | ||
95 | hlist_nulls_for_each_entry_rcu(__sk, node, list, __sk_common.skc_portaddr_node) | ||
96 | |||
91 | #define IS_UDPLITE(__sk) (udp_sk(__sk)->pcflag) | 97 | #define IS_UDPLITE(__sk) (udp_sk(__sk)->pcflag) |
92 | 98 | ||
93 | #endif | 99 | #endif |
diff --git a/include/net/udp.h b/include/net/udp.h index af41850f742a..5348d80b25bb 100644 --- a/include/net/udp.h +++ b/include/net/udp.h | |||
@@ -158,7 +158,8 @@ static inline void udp_lib_close(struct sock *sk, long timeout) | |||
158 | } | 158 | } |
159 | 159 | ||
160 | extern int udp_lib_get_port(struct sock *sk, unsigned short snum, | 160 | extern int udp_lib_get_port(struct sock *sk, unsigned short snum, |
161 | int (*)(const struct sock*,const struct sock*)); | 161 | int (*)(const struct sock *,const struct sock *), |
162 | unsigned int hash2_nulladdr); | ||
162 | 163 | ||
163 | /* net/ipv4/udp.c */ | 164 | /* net/ipv4/udp.c */ |
164 | extern int udp_get_port(struct sock *sk, unsigned short snum, | 165 | extern int udp_get_port(struct sock *sk, unsigned short snum, |