: Consolidate inet(6)_hash_connect.
Subsystems (4)
PATCH 2/6 : Consolidate inet(6)_hash_connect.
These two functions are the same except for what they call to "check_established" and "hash" for a socket.
This saves half-a-kilo for ipv4 and ipv6.
add/remove: 1/0 grow/shrink: 1/4 up/down: 582/-1128 (-546)
function old new delta __inet_hash_connect - 577 +577 arp_ignore 108 113 +5 static.hint 8 4 -4 rt_worker_func 376 372 -4 inet6_hash_connect 584 25 -559 inet_hash_connect 586 25 -561
--- include/net/inet_hashtables.h | 5 ++ net/ipv4/inet_hashtables.c | 32 +++++++++----- net/ipv6/inet6_hashtables.c | 93 +---------------------------------------- 3 files changed, 28 insertions(+), 102 deletions(-)
include/net/inet_hashtables.h +5 -0
@@ -413,6 +413,11 @@ static inline struct sock *inet_lookup(struct inet_hashinfo *hashinfo, return sk; } +extern int __inet_hash_connect (struct inet_timewait_death_row *death_row, +struct sock *sk, +int (*check_established)(struct inet_timewait_death_row *, +struct sock *,__u16 ,struct inet_timewait_sock **), +void (*hash)(struct inet_hashinfo *,struct sock *));extern int inet_hash_connect (struct inet_timewait_death_row *death_row,struct sock *sk);#endif /* _INET_HASHTABLES_H */
net/ipv4/inet_hashtables.c +21 -11
@@ -348,11 +348,11 @@ void __inet_hash(struct inet_hashinfo *hashinfo, struct sock *sk) }EXPORT_SYMBOL_GPL (__inet_hash); -/* -* Bind a port for a connect operation and hash it. -*/ -int inet_hash_connect (struct inet_timewait_death_row *death_row, -struct sock *sk) +int __inet_hash_connect (struct inet_timewait_death_row *death_row, +struct sock *sk, +int (*check_established)(struct inet_timewait_death_row *, +struct sock *,__u16 ,struct inet_timewait_sock **), +void (*hash)(struct inet_hashinfo *,struct sock *)) {struct inet_hashinfo *hinfo = death_row->hashinfo;const unsigned short snum =inet_sk (sk)->num;
@@ -385,9 +385,8 @@ int inet_hash_connect(struct inet_timewait_death_row *death_row,BUG_TRAP (!hlist_empty (&tb->owners));if (tb->fastreuse >=0 ) goto next_port; -if (!__inet_check_established (death_row, - sk, port, - &tw)) +if (!check_established (death_row, sk, + port, &tw)) goto ok; goto next_port; }
@@ -415,7 +414,7 @@ ok:inet_bind_hash (sk, tb, port);if (sk_unhashed (sk)) {inet_sk (sk)->sport =htons (port); -__inet_hash_nolisten (hinfo, sk); +hash (hinfo, sk); }spin_unlock (&head->lock);
@@ -432,17 +431,28 @@ ok: tb =inet_csk (sk)->icsk_bind_hash;spin_lock_bh (&head->lock);if (sk_head (&tb->owners) == sk && !sk->sk_bind_node.next) { -__inet_hash_nolisten (hinfo, sk); +hash (hinfo, sk);spin_unlock_bh (&head->lock);return 0 ; }else {spin_unlock (&head->lock);/* No definite answer... Walk to established hash table */ - ret =__inet_check_established (death_row, sk, snum,NULL ); + ret =check_established (death_row, sk, snum,NULL ); out:local_bh_enable ();return ret; } } +EXPORT_SYMBOL_GPL (__inet_hash_connect); + +/* +* Bind a port for a connect operation and hash it. +*/ +int inet_hash_connect (struct inet_timewait_death_row *death_row, +struct sock *sk) +{ +return __inet_hash_connect (death_row, sk, + __inet_check_established, __inet_hash_nolisten); +}EXPORT_SYMBOL_GPL (inet_hash_connect);
net/ipv6/inet6_hashtables.c +2 -91
99 lines not on this page · raw message
Signature · 1 line
1.5.3.4
Em Thu, Jan 31, 2008 at 03:32:09PM +0300, Pavel Emelyanov escreveu:
Quoted 4 lines
These two functions are the same except for what they call to "
check_established" and "hash" for a socket.This saves half-a-kilo for ipv4 and ipv6.
Good stuff!
Yesterday I was perusing tcp_hash and I think we could have the hashinfo pointer stored perhaps in sk->sk_prot.
That way we would be able to kill tcp_hash(), inet_put_port() could receive just sk, etc.
What do you think?
- Arnaldo
David Miller
maintainerFrom: Arnaldo Carvalho de Melo <[email protected]>
Date: Thu, 31 Jan 2008 11:01:53 -0200
Quoted 8 lines
Em Thu, Jan 31, 2008 at 03:32:09PM +0300, Pavel Emelyanov escreveu:
Quoted 4 lines
These two functions are the same except for what they call to "
check_established" and "hash" for a socket.This saves half-a-kilo for ipv4 and ipv6.
Good stuff!
Quoted 7 lines
Yesterday I was perusing
tcp_hashand I think we could have the hashinfo pointer stored perhaps insk->sk_prot.That way we would be able to kill
tcp_hash(),inet_put_port()could receive just sk, etc.What do you think?
Sounds good to me.
Quoted 6 lines · Arnaldo Carvalho de Melo
Em Thu, Jan 31, 2008 at 03:32:09PM +0300, Pavel Emelyanov escreveu:
Quoted 4 lines
These two functions are the same except for what they call to "
check_established" and "hash" for a socket.This saves half-a-kilo for ipv4 and ipv6.
Quoted 7 lines
Good stuff!
Yesterday I was perusing
tcp_hashand I think we could have the hashinfo pointer stored perhaps insk->sk_prot.That way we would be able to kill
tcp_hash(),inet_put_port()could receive just sk, etc.
But each proto will still have its own hashfn, so proto's callbacks will be called to hash/unhash sockets, so this will give us just one extra dereference. No?
Quoted 1 line
What do you think?
Hmmm... Even raw_hash, etc may become simpler. On the other hand maybe this is a good idea, but I'm not very common with this code yet to foresee such things in advance... I think that we should try to prepare a patch and look, but if you have smth ready, then it's better to review your stuff first.
Quoted 2 lines
- Arnaldo
Thanks,
Pavel
Em Thu, Jan 31, 2008 at 04:18:51PM +0300, Pavel Emelyanov escreveu:
Quoted 19 lines
Quoted 6 lines · Arnaldo Carvalho de Melo
Em Thu, Jan 31, 2008 at 03:32:09PM +0300, Pavel Emelyanov escreveu:
Quoted 4 lines
These two functions are the same except for what they call to "
check_established" and "hash" for a socket.This saves half-a-kilo for ipv4 and ipv6.
Quoted 7 lines
Good stuff!
Yesterday I was perusing
tcp_hashand I think we could have the hashinfo pointer stored perhaps insk->sk_prot.That way we would be able to kill
tcp_hash(),inet_put_port()could receive just sk, etc.But each proto will still have its own hashfn, so proto's callbacks will be called to hash/unhash sockets, so this will give us just one extra dereference. No?
Quoted 7 lines
Quoted 1 line
What do you think?
Hmmm... Even
raw_hash, etc may become simpler. On the other hand maybe this is a good idea, but I'm not very common with this code yet to foresee such things in advance... I think that we should try to prepare a patch and look, but if you have smth ready, then it's better to review your stuff first.
gimme some minutes
- Arnaldo
Em Thu, Jan 31, 2008 at 11:39:55AM -0200, Arnaldo Carvalho de Melo escreveu:
Quoted 22 lines
Em Thu, Jan 31, 2008 at 04:18:51PM +0300, Pavel Emelyanov escreveu:
Quoted 21 lines
Quoted 6 lines · Arnaldo Carvalho de Melo
Em Thu, Jan 31, 2008 at 03:32:09PM +0300, Pavel Emelyanov escreveu:
Quoted 4 lines
These two functions are the same except for what they call to "
check_established" and "hash" for a socket.This saves half-a-kilo for ipv4 and ipv6.
Quoted 7 lines
Good stuff!
Yesterday I was perusing
tcp_hashand I think we could have the hashinfo pointer stored perhaps insk->sk_prot.That way we would be able to kill
tcp_hash(),inet_put_port()could receive just sk, etc.But each proto will still have its own hashfn, so proto's callbacks will be called to hash/unhash sockets, so this will give us just one extra dereference. No?
Quoted 1 line
What do you think?
Quoted 7 lines
Quoted 5 lines
Hmmm... Even
raw_hash, etc may become simpler. On the other hand maybe this is a good idea, but I'm not very common with this code yet to foresee such things in advance... I think that we should try to prepare a patch and look, but if you have smth ready, then it's better to review your stuff first.gimme some minutes
A bit more than minutes tho, but here it is, I'm testing it now.
Take a look and if testing is ok I'll submit it with a proper description.
- Arnaldo
include/net/inet6_hashtables.h +1 -1
@@ -49,7 +49,7 @@ static inline int inet6_sk_ehashfn(const struct sock *sk)return inet6_ehashfn (laddr, lport, faddr, fport); } -extern void __inet6_hash (struct inet_hashinfo *hashinfo,struct sock *sk); +extern void __inet6_hash (struct sock *sk);/* * Sockets in TCP_CLOSE state are _always_ taken out of the hash, so
include/net/inet_connection_sock.h +3 -5
@@ -29,7 +29,6 @@#undef INET_CSK_CLEAR_TIMERSstruct inet_bind_bucket ; -struct inet_hashinfo ;struct tcp_congestion_ops ;/*
@@ -59,6 +58,8 @@ struct inet_connection_sock_af_ops { int level, int optname, char __user *optval, int __user *optlen);void (*addr2sockaddr)(struct sock *sk,struct sockaddr *); +int (*bind_conflict)(const struct sock *sk, +const struct inet_bind_bucket *tb); };/** inet_connection_sock - INET connection oriented sock
@@ -244,10 +245,7 @@ extern struct request_sock *inet_csk_search_req(const struct sock *sk, const __be32 laddr);extern int inet_csk_bind_conflict (const struct sock *sk,const struct inet_bind_bucket *tb); -extern int inet_csk_get_port (struct inet_hashinfo *hashinfo, -struct sock *sk,unsigned short snum, -int (*bind_conflict)(const struct sock *sk, -const struct inet_bind_bucket *tb)); +extern int inet_csk_get_port (struct sock *sk,unsigned short snum);extern struct dst_entry *inet_csk_route_req (struct sock *sk,const struct request_sock *req);
include/net/inet_hashtables.h +9 -42
81 lines not on this page · raw message
include/net/sock.h +3 -0
@@ -496,6 +496,7 @@ extern int sk_wait_data(struct sock *sk, long *timeo);struct request_sock_ops ;struct timewait_sock_ops ; +struct inet_hashinfo ;/* Networking protocol blocks we attach to sockets. * socket layer -> transport layer interface
@@ -578,6 +579,8 @@ struct proto {struct request_sock_ops *rsk_prot;struct timewait_sock_ops *twsk_prot; +struct inet_hashinfo *hashinfo; +struct module *owner;char name[32 ];
net/dccp/dccp.h +0 -2
@@ -271,8 +271,6 @@ extern struct sk_buff *dccp_make_response(struct sock *sk,extern int dccp_connect (struct sock *sk);extern int dccp_disconnect (struct sock *sk,int flags); -extern void dccp_hash (struct sock *sk); -extern void dccp_unhash (struct sock *sk);extern int dccp_getsockopt (struct sock *sk,int level,int optname,char __user *optval,int __user *optlen); extern int dccp_setsockopt(struct sock *sk, int level, int optname,
net/dccp/ipv4.c +7 -11
@@ -38,12 +38,6 @@*/ static struct socket *dccp_v4_ctl_socket; -static int dccp_v4_get_port (struct sock *sk,const unsigned short snum) -{ -return inet_csk_get_port (&dccp_hashinfo, sk, snum, - inet_csk_bind_conflict); -} -int dccp_v4_connect (struct sock *sk,struct sockaddr *uaddr,int addr_len) {struct inet_sock *inet =inet_sk (sk);
@@ -408,8 +402,8 @@ struct sock *dccp_v4_request_recv_sock(struct sock *sk, struct sk_buff *skb,dccp_sync_mss (newsk,dst_mtu (dst)); -__inet_hash_nolisten (&dccp_hashinfo, newsk); -__inet_inherit_port (&dccp_hashinfo, sk, newsk); +__inet_hash_nolisten (newsk); +__inet_inherit_port (sk, newsk);return newsk;
@@ -898,6 +892,7 @@ static struct inet_connection_sock_af_ops dccp_ipv4_af_ops = { .getsockopt = ip_getsockopt, .addr2sockaddr = inet_csk_addr2sockaddr, .sockaddr_len = sizeof(struct sockaddr_in), + .bind_conflict = inet_csk_bind_conflict, #ifdef CONFIG_COMPAT .compat_setsockopt = compat_ip_setsockopt, .compat_getsockopt = compat_ip_getsockopt,
@@ -937,10 +932,10 @@ static struct proto dccp_v4_prot = { .sendmsg = dccp_sendmsg, .recvmsg = dccp_recvmsg, .backlog_rcv = dccp_v4_do_rcv, - .hash = dccp_hash, - .unhash = dccp_unhash, + .hash = inet_hash, + .unhash = inet_unhash, .accept = inet_csk_accept, - .get_port = dccp_v4_get_port, + .get_port = inet_csk_get_port, .shutdown = dccp_shutdown, .destroy = dccp_destroy_sock, .orphan_count = &dccp_orphan_count,
@@ -948,6 +943,7 @@ static struct proto dccp_v4_prot = { .obj_size = sizeof(struct dccp_sock), .rsk_prot = &dccp_request_sock_ops, .twsk_prot = &dccp_timewait_sock_ops, + .hashinfo = &dccp_hashinfo, #ifdef CONFIG_COMPAT .compat_setsockopt = compat_dccp_setsockopt, .compat_getsockopt = compat_dccp_getsockopt,
net/dccp/ipv6.c +8 -12
@@ -39,21 +39,15 @@ static struct socket *dccp_v6_ctl_socket;static struct inet_connection_sock_af_ops dccp_ipv6_mapped;static struct inet_connection_sock_af_ops dccp_ipv6_af_ops; -static int dccp_v6_get_port (struct sock *sk,unsigned short snum) -{ -return inet_csk_get_port (&dccp_hashinfo, sk, snum, - inet6_csk_bind_conflict); -} -static void dccp_v6_hash (struct sock *sk) {if (sk->sk_state !=DCCP_CLOSED ) {if (inet_csk (sk)->icsk_af_ops == &dccp_ipv6_mapped) { -dccp_hash (sk); +inet_hash (sk);return ; }local_bh_disable (); -__inet6_hash (&dccp_hashinfo, sk); +__inet6_hash (sk);local_bh_enable (); } }
@@ -630,8 +624,8 @@ static struct sock *dccp_v6_request_recv_sock(struct sock *sk, newinet->daddr = newinet->saddr = newinet->rcv_saddr =LOOPBACK4_IPV6 ; -__inet6_hash (&dccp_hashinfo, newsk); -inet_inherit_port (&dccp_hashinfo, sk, newsk); +__inet6_hash (newsk); +inet_inherit_port (sk, newsk);return newsk;
@@ -1054,6 +1048,7 @@ static struct inet_connection_sock_af_ops dccp_ipv6_af_ops = { .getsockopt = ipv6_getsockopt, .addr2sockaddr = inet6_csk_addr2sockaddr, .sockaddr_len = sizeof(struct sockaddr_in6), + .bind_conflict = inet6_csk_bind_conflict, #ifdef CONFIG_COMPAT .compat_setsockopt = compat_ipv6_setsockopt, .compat_getsockopt = compat_ipv6_getsockopt,
@@ -1123,9 +1118,9 @@ static struct proto dccp_v6_prot = { .recvmsg = dccp_recvmsg, .backlog_rcv = dccp_v6_do_rcv, .hash = dccp_v6_hash, - .unhash = dccp_unhash, + .unhash = inet_unhash, .accept = inet_csk_accept, - .get_port = dccp_v6_get_port, + .get_port = inet_csk_get_port, .shutdown = dccp_shutdown, .destroy = dccp_v6_destroy_sock, .orphan_count = &dccp_orphan_count,
@@ -1133,6 +1128,7 @@ static struct proto dccp_v6_prot = { .obj_size = sizeof(struct dccp6_sock), .rsk_prot = &dccp6_request_sock_ops, .twsk_prot = &dccp6_timewait_sock_ops, + .hashinfo = &dccp_hashinfo, #ifdef CONFIG_COMPAT .compat_setsockopt = compat_dccp_setsockopt, .compat_getsockopt = compat_dccp_getsockopt,
net/dccp/proto.c +2 -16
@@ -78,7 +78,7 @@ void dccp_set_state(struct sock *sk, const int state) sk->sk_prot->unhash (sk);if (inet_csk (sk)->icsk_bind_hash !=NULL && !(sk->sk_userlocks &SOCK_BINDPORT_LOCK )) -inet_put_port (&dccp_hashinfo, sk); +inet_put_port (sk);/* fall through */ default :if (oldstate ==DCCP_OPEN )
@@ -173,20 +173,6 @@ const char *dccp_state_name(const int state)EXPORT_SYMBOL_GPL (dccp_state_name); -void dccp_hash (struct sock *sk) -{ -inet_hash (&dccp_hashinfo, sk); -} - -EXPORT_SYMBOL_GPL (dccp_hash); - -void dccp_unhash (struct sock *sk) -{ -inet_unhash (&dccp_hashinfo, sk); -} - -EXPORT_SYMBOL_GPL (dccp_unhash); -int dccp_init_sock (struct sock *sk,const __u8 ctl_sock_initialized) {struct dccp_sock *dp =dccp_sk (sk);
@@ -268,7 +254,7 @@ int dccp_destroy_sock(struct sock *sk)/* Clean up a referenced DCCP bind bucket. */ if (inet_csk (sk)->icsk_bind_hash !=NULL ) -inet_put_port (&dccp_hashinfo, sk); +inet_put_port (sk);kfree (dp->dccps_service_list); dp->dccps_service_list =NULL ;
net/ipv4/inet_connection_sock.c +3 -5
@@ -78,11 +78,9 @@ EXPORT_SYMBOL_GPL(inet_csk_bind_conflict);/* Obtain a reference to a local port for the given sock, * if snum is zero it means select any available local port. */ -int inet_csk_get_port (struct inet_hashinfo *hashinfo, -struct sock *sk,unsigned short snum, -int (*bind_conflict)(const struct sock *sk, -const struct inet_bind_bucket *tb)) +int inet_csk_get_port (struct sock *sk,unsigned short snum) { +struct inet_hashinfo *hashinfo = sk->sk_prot->hashinfo;struct inet_bind_hashbucket *head;struct hlist_node *node;struct inet_bind_bucket *tb;
@@ -142,7 +140,7 @@ tb_found: goto success; }else { ret =1 ; -if (bind_conflict (sk, tb)) +if (inet_csk (sk)->icsk_af_ops->bind_conflict (sk, tb)) goto fail_unlock; } }
net/ipv4/inet_hashtables.c +48 -10
114 lines not on this page · raw message
net/ipv4/tcp.c +1 -1
@@ -1669,7 +1669,7 @@ void tcp_set_state(struct sock *sk, int state) sk->sk_prot->unhash (sk);if (inet_csk (sk)->icsk_bind_hash && !(sk->sk_userlocks &SOCK_BINDPORT_LOCK )) -inet_put_port (&tcp_hashinfo, sk); +inet_put_port (sk);/* fall through */ default :if (oldstate==TCP_ESTABLISHED )
net/ipv4/tcp_ipv4.c +8 -23
@@ -108,22 +108,6 @@ struct inet_hashinfo __cacheline_aligned tcp_hashinfo = { .lhash_wait = __WAIT_QUEUE_HEAD_INITIALIZER(tcp_hashinfo.lhash_wait), }; -static int tcp_v4_get_port (struct sock *sk,unsigned short snum) -{ -return inet_csk_get_port (&tcp_hashinfo, sk, snum, - inet_csk_bind_conflict); -} - -static void tcp_v4_hash (struct sock *sk) -{ -inet_hash (&tcp_hashinfo, sk); -} - -void tcp_unhash (struct sock *sk) -{ -inet_unhash (&tcp_hashinfo, sk); -} -static inline __u32 tcp_v4_init_sequence (struct sk_buff *skb) { return secure_tcp_sequence_number(ip_hdr(skb)->daddr,
@@ -1478,8 +1462,8 @@ struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb, }#endif -__inet_hash_nolisten (&tcp_hashinfo, newsk); -__inet_inherit_port (&tcp_hashinfo, sk, newsk); +__inet_hash_nolisten (newsk); +__inet_inherit_port (sk, newsk);return newsk;
@@ -1827,6 +1811,7 @@ struct inet_connection_sock_af_ops ipv4_specific = { .getsockopt = ip_getsockopt, .addr2sockaddr = inet_csk_addr2sockaddr, .sockaddr_len = sizeof(struct sockaddr_in), + .bind_conflict = inet_csk_bind_conflict, #ifdef CONFIG_COMPAT .compat_setsockopt = compat_ip_setsockopt, .compat_getsockopt = compat_ip_getsockopt,
@@ -1926,7 +1911,7 @@ int tcp_v4_destroy_sock(struct sock *sk)/* Clean up a referenced TCP bind bucket. */ if (inet_csk (sk)->icsk_bind_hash) -inet_put_port (&tcp_hashinfo, sk); +inet_put_port (sk);/* * If sendmsg cached page exists, toss it.
@@ -2435,9 +2420,9 @@ struct proto tcp_prot = { .getsockopt = tcp_getsockopt, .recvmsg = tcp_recvmsg, .backlog_rcv = tcp_v4_do_rcv, - .hash = tcp_v4_hash, - .unhash = tcp_unhash, - .get_port = tcp_v4_get_port, + .hash = inet_hash, + .unhash = inet_unhash, + .get_port = inet_csk_get_port, .enter_memory_pressure = tcp_enter_memory_pressure, .sockets_allocated = &tcp_sockets_allocated, .orphan_count = &tcp_orphan_count,
@@ -2450,6 +2435,7 @@ struct proto tcp_prot = { .obj_size = sizeof(struct tcp_sock), .twsk_prot = &tcp_timewait_sock_ops, .rsk_prot = &tcp_request_sock_ops, + .hashinfo = &tcp_hashinfo, #ifdef CONFIG_COMPAT .compat_setsockopt = compat_tcp_setsockopt, .compat_getsockopt = compat_tcp_getsockopt,
@@ -2467,7 +2453,6 @@ void __init tcp_v4_init(struct net_proto_family *ops)EXPORT_SYMBOL (ipv4_specific);EXPORT_SYMBOL (tcp_hashinfo);EXPORT_SYMBOL (tcp_prot); -EXPORT_SYMBOL (tcp_unhash);EXPORT_SYMBOL (tcp_v4_conn_request);EXPORT_SYMBOL (tcp_v4_connect);EXPORT_SYMBOL (tcp_v4_do_rcv);
net/ipv6/inet6_hashtables.c +2 -2
@@ -22,9 +22,9 @@#include <net/inet6_hashtables.h> #include <net/ip.h> -void __inet6_hash (struct inet_hashinfo *hashinfo, -struct sock *sk) +void __inet6_hash (struct sock *sk) { +struct inet_hashinfo *hashinfo = sk->sk_prot->hashinfo;struct hlist_head *list;rwlock_t *lock;
net/ipv6/tcp_ipv6.c +8 -11
@@ -86,12 +86,6 @@ static struct tcp_sock_af_ops tcp_sock_ipv6_specific;static struct tcp_sock_af_ops tcp_sock_ipv6_mapped_specific;#endif -static int tcp_v6_get_port (struct sock *sk,unsigned short snum) -{ -return inet_csk_get_port (&tcp_hashinfo, sk, snum, - inet6_csk_bind_conflict); -} -static void tcp_v6_hash (struct sock *sk) {if (sk->sk_state !=TCP_CLOSE ) {
@@ -100,7 +94,7 @@ static void tcp_v6_hash(struct sock *sk)return ; }local_bh_disable (); -__inet6_hash (&tcp_hashinfo, sk); +__inet6_hash (sk);local_bh_enable (); } }
@@ -1504,8 +1498,8 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb, }#endif -__inet6_hash (&tcp_hashinfo, newsk); -inet_inherit_port (&tcp_hashinfo, sk, newsk); +__inet6_hash (newsk); +inet_inherit_port (sk, newsk);return newsk;
@@ -1833,6 +1827,7 @@ static struct inet_connection_sock_af_ops ipv6_specific = { .getsockopt = ipv6_getsockopt, .addr2sockaddr = inet6_csk_addr2sockaddr, .sockaddr_len = sizeof(struct sockaddr_in6), + .bind_conflict = inet6_csk_bind_conflict, #ifdef CONFIG_COMPAT .compat_setsockopt = compat_ipv6_setsockopt, .compat_getsockopt = compat_ipv6_getsockopt,
@@ -1864,6 +1859,7 @@ static struct inet_connection_sock_af_ops ipv6_mapped = { .getsockopt = ipv6_getsockopt, .addr2sockaddr = inet6_csk_addr2sockaddr, .sockaddr_len = sizeof(struct sockaddr_in6), + .bind_conflict = inet6_csk_bind_conflict, #ifdef CONFIG_COMPAT .compat_setsockopt = compat_ipv6_setsockopt, .compat_getsockopt = compat_ipv6_getsockopt,
@@ -2127,8 +2123,8 @@ struct proto tcpv6_prot = { .recvmsg = tcp_recvmsg, .backlog_rcv = tcp_v6_do_rcv, .hash = tcp_v6_hash, - .unhash = tcp_unhash, - .get_port = tcp_v6_get_port, + .unhash = inet_unhash, + .get_port = inet_csk_get_port, .enter_memory_pressure = tcp_enter_memory_pressure, .sockets_allocated = &tcp_sockets_allocated, .memory_allocated = &tcp_memory_allocated,
@@ -2141,6 +2137,7 @@ struct proto tcpv6_prot = { .obj_size = sizeof(struct tcp6_sock), .twsk_prot = &tcp6_timewait_sock_ops, .rsk_prot = &tcp6_request_sock_ops, + .hashinfo = &tcp_hashinfo, #ifdef CONFIG_COMPAT .compat_setsockopt = compat_tcp_setsockopt, .compat_getsockopt = compat_tcp_getsockopt,
From: Pavel Emelyanov <[email protected]>
Date: Thu, 31 Jan 2008 15:32:09 +0300
Quoted 14 lines
These two functions are the same except for what they call to "
check_established" and "hash" for a socket.This saves half-a-kilo for ipv4 and ipv6.
add/remove: 1/0 grow/shrink: 1/4 up/down: 582/-1128 (-546)
function old new delta __inet_hash_connect - 577 +577 arp_ignore 108 113 +5 static.hint 8 4 -4 rt_worker_func 376 372 -4 inet6_hash_connect 584 25 -559 inet_hash_connect 586 25 -561
Quoted 1 line
Signed-off-by Pavel Emelyanov <[email protected]>
Applied.