1. 03 12月, 2006 2 次提交
    • A
      [INET_CONNECTION_SOCK]: Pack struct inet_connection_sock_af_ops · 850db6b8
      Arnaldo Carvalho de Melo 提交于
      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: NArnaldo Carvalho de Melo <acme@mandriva.com>
      850db6b8
    • D
      [TCP]: Don't set SKB owner in tcp_transmit_skb(). · 93173112
      David S. Miller 提交于
      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: NDavid S. Miller <davem@davemloft.net>
      93173112
  2. 29 9月, 2006 2 次提交
  3. 23 9月, 2006 1 次提交
    • A
      [TCP]: Send ACKs each 2nd received segment. · 1ef9696c
      Alexey Kuznetsov 提交于
      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: NAlexey Kuznetsov <kuznet@ms2.inr.ac.ru>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      1ef9696c
  4. 21 3月, 2006 5 次提交
  5. 11 1月, 2006 1 次提交
  6. 04 1月, 2006 6 次提交
  7. 09 10月, 2005 1 次提交
  8. 30 8月, 2005 8 次提交