26 Jan, 2007

1 commit


04 Dec, 2006

1 commit


03 Dec, 2006

2 commits

  • 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

    Arnaldo Carvalho de Melo
     
  • The data itself is already charged to the SKB, doing
    the skb_set_owner_w() just generates a lot of noise and
    extra atomics we don't really need.

    Lmbench improvements on lat_tcp are minimal:

    before:
    TCP latency using localhost: 23.2701 microseconds
    TCP latency using localhost: 23.1994 microseconds
    TCP latency using localhost: 23.2257 microseconds

    after:
    TCP latency using localhost: 22.8380 microseconds
    TCP latency using localhost: 22.9465 microseconds
    TCP latency using localhost: 22.8462 microseconds

    Signed-off-by: David S. Miller

    David S. Miller
     

29 Sep, 2006

2 commits


23 Sep, 2006

1 commit

  • It does not affect either mss-sized connections (obviously) or
    connections controlled by Nagle (because there is only one small
    segment in flight).

    The idea is to record the fact that a small segment arrives on a
    connection, where one small segment has already been received and
    still not-ACKed. In this case ACK is forced after tcp_recvmsg() drains
    receive buffer.

    In other words, it is a "soft" each-2nd-segment ACK, which is enough
    to preserve ACK clock even when ABC is enabled.

    Signed-off-by: Alexey Kuznetsov
    Signed-off-by: David S. Miller

    Alexey Kuznetsov
     

21 Mar, 2006

5 commits


11 Jan, 2006

1 commit


04 Jan, 2006

6 commits


09 Oct, 2005

1 commit

  • - added typedef unsigned int __nocast gfp_t;

    - replaced __nocast uses for gfp flags with gfp_t - it gives exactly
    the same warnings as far as sparse is concerned, doesn't change
    generated code (from gcc point of view we replaced unsigned int with
    typedef) and documents what's going on far better.

    Signed-off-by: Al Viro
    Signed-off-by: Linus Torvalds

    Al Viro
     

30 Aug, 2005

8 commits