Arnaldo Carvalho de Melo
850db6b8c5
[INET_CONNECTION_SOCK]: Pack struct inet_connection_sock_af_ops
We have a hole in:
[acme@newtoy net-2.6.20]$ pahole net/ipv6/tcp_ipv6.o inet_connection_sock_af_ops
/* /pub/scm/linux/kernel/git/acme/net-2.6.20/include/net/inet_connection_sock.h:38 */
struct inet_connection_sock_af_ops {
int (*queue_xmit)(); /* 0 4 */
void (*send_check)(); /* 4 4 */
int (*rebuild_header)(); /* 8 4 */
int (*conn_request)(); /* 12 4 */
struct sock * (*syn_recv_sock)(); /* 16 4 */
int (*remember_stamp)(); /* 20 4 */
__u16 net_header_len; /* 24 2 */
/* XXX 2 bytes hole, try to pack */
int (*setsockopt)(); /* 28 4 */
int (*getsockopt)(); /* 32 4 */
int (*compat_setsockopt)(); /* 36 4 */
int (*compat_getsockopt)(); /* 40 4 */
void (*addr2sockaddr)(); /* 44 4 */
int sockaddr_len; /* 48 4 */
}; /* size: 52, sum members: 50, holes: 1, sum holes: 2 */
But we don't need sockaddr_len to be an int:
[acme@newtoy net-2.6.20]$ find net -name "*.[ch]" | xargs grep '\.sockaddr_len.\+=' | sort -u
net/dccp/ipv4.c: .sockaddr_len = sizeof(struct sockaddr_in),
net/dccp/ipv6.c: .sockaddr_len = sizeof(struct sockaddr_in6),
net/ipv4/tcp_ipv4.c: .sockaddr_len = sizeof(struct sockaddr_in),
net/ipv6/tcp_ipv6.c: .sockaddr_len = sizeof(struct sockaddr_in6),
net/sctp/ipv6.c: .sockaddr_len = sizeof(struct sockaddr_in6),
net/sctp/protocol.c: .sockaddr_len = sizeof(struct sockaddr_in),
[acme@newtoy net-2.6.20]$ pahole --sizes net/ipv6/tcp_ipv6.o | grep sockaddr_in
struct sockaddr_in: 16 0
struct sockaddr_in6: 28 0
[acme@newtoy net-2.6.20]$
So I turned sockaddr_len a 'u16', and now:
[acme@newtoy net-2.6.20]$ pahole net/ipv6/tcp_ipv6.o inet_connection_sock_af_ops
/* /pub/scm/linux/kernel/git/acme/net-2.6.20/include/net/inet_connection_sock.h:38 */
struct inet_connection_sock_af_ops {
int (*queue_xmit)(); /* 0 4 */
void (*send_check)(); /* 4 4 */
int (*rebuild_header)(); /* 8 4 */
int (*conn_request)(); /* 12 4 */
struct sock * (*syn_recv_sock)(); /* 16 4 */
int (*remember_stamp)(); /* 20 4 */
u16 net_header_len; /* 24 2 */
u16 sockaddr_len; /* 26 2 */
int (*setsockopt)(); /* 28 4 */
int (*getsockopt)(); /* 32 4 */
int (*compat_setsockopt)(); /* 36 4 */
int (*compat_getsockopt)(); /* 40 4 */
void (*addr2sockaddr)(); /* 44 4 */
}; /* size: 48 */
So we've saved 4 bytes:
[acme@newtoy net-2.6.20]$ codiff -sV /tmp/tcp_ipv6.o.before net/ipv6/tcp_ipv6.o
/pub/scm/linux/kernel/git/acme/net-2.6.20/net/ipv6/tcp_ipv6.c:
struct inet_connection_sock_af_ops | -4
net_header_len;
from: __u16 /* 24(0) 2(0) */
to: u16 /* 24(0) 2(0) */
sockaddr_len;
from: int /* 48(0) 4(0) */
to: u16 /* 26(0) 2(0) */
1 struct changed
[acme@newtoy net-2.6.20]$
Signed-off-by: Arnaldo Carvalho de Melo <acme@mandriva.com>
2006-12-02 21:30:46 -08:00
..
2006-12-01 14:52:01 -08:00
2006-12-02 21:23:01 -08:00
2006-12-02 21:23:15 -08:00
2006-12-02 21:23:16 -08:00
2006-12-02 21:23:18 -08:00
2006-12-02 21:23:02 -08:00
2006-12-02 21:23:03 -08:00
2006-12-01 14:52:01 -08:00
2006-12-02 21:23:04 -08:00
2006-12-02 21:23:19 -08:00
2006-12-02 21:23:05 -08:00
2006-12-02 21:23:06 -08:00
2006-12-02 21:23:07 -08:00
2006-12-02 21:23:08 -08:00
2006-12-02 21:23:09 -08:00
2006-12-02 21:23:10 -08:00
2006-12-02 21:23:20 -08:00
2006-12-01 14:52:01 -08:00
2006-12-02 21:23:21 -08:00
2006-12-02 21:23:22 -08:00
2006-12-02 21:23:11 -08:00
2006-12-02 21:23:22 -08:00
2006-12-02 21:23:23 -08:00
2006-12-01 14:52:01 -08:00
2006-12-02 21:23:13 -08:00
2006-12-02 21:23:14 -08:00
2006-12-02 21:23:24 -08:00
2006-09-21 11:46:17 +10:00
2006-06-26 09:58:18 -07:00
2006-12-02 21:30:44 -08:00
2006-10-03 15:13:48 -03:00
2006-10-01 17:55:53 +01:00
2006-12-02 21:30:46 -08:00
2006-11-29 15:33:10 -08:00
2006-11-28 17:26:50 -08:00
2006-12-01 14:52:01 -08:00
2006-10-03 23:01:26 +02:00
2006-09-19 12:43:58 +01:00