• Arnaldo Carvalho de Melo's avatar
    [INET_CONNECTION_SOCK]: Pack struct inet_connection_sock_af_ops · 850db6b8
    Arnaldo Carvalho de Melo authored
    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: default avatarArnaldo Carvalho de Melo <acme@mandriva.com>
    850db6b8
inet_connection_sock.h 10.6 KB