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-02 21:21:29 -08:00
2006-12-02 21:22:48 -08:00
2006-06-20 15:10:08 -07:00
2006-12-02 21:27:14 -08:00
2006-09-22 14:55:10 -07:00
2006-12-02 21:21:08 -08:00
2006-09-22 14:55:10 -07:00
2006-12-02 21:22:52 -08:00
2006-08-02 14:12:06 -07:00
2006-09-21 11:46:18 +10:00
2006-12-02 21:22:50 -08:00
2006-12-02 21:22:55 -08:00
2006-07-03 19:30:18 -07:00
2006-12-02 21:23:39 -08:00
2006-12-02 21:24:12 -08:00
2006-06-20 15:10:08 -07:00
2006-03-20 22:42:39 -08:00
2006-09-22 14:54:40 -07:00
2006-03-20 22:42:39 -08:00
2006-03-20 22:42:39 -08:00
2006-03-20 22:42:39 -08:00
2006-10-21 20:24:01 -07:00
2006-12-02 21:23:40 -08:00
2006-09-28 18:02:58 -07:00
2006-09-22 15:17:35 -07:00
2006-12-02 21:22:11 -08:00
2006-12-02 21:21:39 -08:00
2006-12-02 21:22:42 -08:00
2006-09-28 18:01:06 -07:00
2006-12-02 00:11:57 -05:00
2006-04-24 16:15:58 -04:00
2006-10-16 20:09:47 -04:00
2006-12-02 21:22:08 -08:00
2006-12-02 21:21:52 -08:00
2006-12-02 21:21:10 -08:00
2006-12-02 21:30:46 -08:00
2006-12-02 21:23:40 -08:00
2006-09-28 18:02:26 -07:00
2006-09-28 18:02:26 -07:00
2006-10-12 00:00:00 -07:00
2006-10-20 00:28:35 -07:00
2006-12-02 21:23:25 -08:00
2006-12-02 21:22:07 -08:00
2006-12-02 21:22:52 -08:00
2006-12-02 21:21:40 -08:00
2006-12-02 21:21:39 -08:00
2006-12-02 21:23:41 -08:00
2006-12-02 21:23:40 -08:00
2006-09-21 11:46:22 +10:00
2006-12-02 21:21:09 -08:00
2006-12-02 21:26:15 -08:00
2006-12-02 21:22:53 -08:00
2006-11-05 14:11:25 -08:00
2006-03-23 07:12:57 -05:00
2006-06-17 21:26:08 -07:00
2006-12-02 21:21:23 -08:00
2006-03-20 22:59:36 -08:00
2006-09-22 15:07:01 -07:00
2006-12-02 21:22:52 -08:00
2006-09-22 15:20:24 -07:00
2006-10-04 03:38:54 -04:00
2006-08-02 13:38:20 -07:00
2006-12-02 21:24:07 -08:00
2006-12-02 21:30:30 -08:00
2006-05-03 23:27:47 -07:00
2006-09-22 14:55:04 -07:00
2006-07-24 12:44:23 -07:00
2006-12-02 21:21:12 -08:00
2006-06-20 15:10:08 -07:00
2006-12-02 21:21:12 -08:00
2006-08-04 22:59:51 -07:00
2006-12-02 21:22:39 -08:00
2006-05-03 23:28:20 -07:00
2006-09-28 18:02:10 -07:00
2006-12-02 21:27:19 -08:00
2006-08-02 14:12:06 -07:00
2006-09-22 14:55:16 -07:00
2006-12-02 21:23:51 -08:00
2006-06-30 14:12:10 -07:00
2006-12-02 21:27:16 -08:00
2006-12-02 21:22:39 -08:00
2006-12-02 21:22:46 -08:00
2006-12-02 21:30:45 -08:00
2006-12-02 21:27:16 -08:00
2006-03-22 00:01:31 -08:00
2006-04-09 22:37:18 -07:00
2006-12-02 21:22:46 -08:00