On Sat, 12 Jan 2008 11:40:10 +0200
"Ilpo Järvinen" <[EMAIL PROTECTED]> wrote:

> net/ipv4/tcp.c:
>   tcp_close_state | -226
>   tcp_done        | -145
>   tcp_close       | -564
>   tcp_disconnect  | -141
>  4 functions changed, 1076 bytes removed, diff: -1076
> 
> net/ipv4/tcp_input.c:
>   tcp_fin               |  -86
>   tcp_rcv_state_process | -164
>  2 functions changed, 250 bytes removed, diff: -250
> 
> net/ipv4/tcp_ipv4.c:
>   tcp_v4_connect | -209
>  1 function changed, 209 bytes removed, diff: -209
> 
> net/ipv4/arp.c:
>   arp_ignore |   +5
>  1 function changed, 5 bytes added, diff: +5
> 
> net/ipv6/tcp_ipv6.c:
>   tcp_v6_connect | -158
>  1 function changed, 158 bytes removed, diff: -158
> 
> net/sunrpc/xprtsock.c:
>   xs_sendpages |   -2
>  1 function changed, 2 bytes removed, diff: -2
> 
> net/dccp/ccids/ccid3.c:
>   ccid3_update_send_interval |   +7
>  1 function changed, 7 bytes added, diff: +7
> 
> net/ipv4/tcp.c:
>   tcp_set_state | +238
>  1 function changed, 238 bytes added, diff: +238
> 
> built-in.o:
>  12 functions changed, 250 bytes added, 1695 bytes removed, diff: -1445
> 
> I've no explanation why some unrelated changes seem to occur
> consistently as well (arp_ignore, ccid3_update_send_interval;
> I checked the arp_ignore asm and it seems to be due to some
> reordered of operation order causing some extra opcodes to be
> generated). Still, the benefits are pretty obvious from the
> codiff's results.
> 
> Signed-off-by: Ilpo Järvinen <[EMAIL PROTECTED]>
> Cc: Andi Kleen <[EMAIL PROTECTED]>
> ---
>  include/net/tcp.h |   35 +----------------------------------
>  net/ipv4/tcp.c    |   35 +++++++++++++++++++++++++++++++++++
>  2 files changed, 36 insertions(+), 34 deletions(-)
> 
> diff --git a/include/net/tcp.h b/include/net/tcp.h
> index 48081ad..306580c 100644
> --- a/include/net/tcp.h
> +++ b/include/net/tcp.h
> @@ -926,40 +926,7 @@ static const char *statename[]={
>       "Close Wait","Last ACK","Listen","Closing"
>  };
>  #endif
> -
> -static inline void tcp_set_state(struct sock *sk, int state)
> -{
> -     int oldstate = sk->sk_state;
> -
> -     switch (state) {
> -     case TCP_ESTABLISHED:
> -             if (oldstate != TCP_ESTABLISHED)
> -                     TCP_INC_STATS(TCP_MIB_CURRESTAB);
> -             break;
> -
> -     case TCP_CLOSE:
> -             if (oldstate == TCP_CLOSE_WAIT || oldstate == TCP_ESTABLISHED)
> -                     TCP_INC_STATS(TCP_MIB_ESTABRESETS);
> -
> -             sk->sk_prot->unhash(sk);
> -             if (inet_csk(sk)->icsk_bind_hash &&
> -                 !(sk->sk_userlocks & SOCK_BINDPORT_LOCK))
> -                     inet_put_port(&tcp_hashinfo, sk);
> -             /* fall through */
> -     default:
> -             if (oldstate==TCP_ESTABLISHED)
> -                     TCP_DEC_STATS(TCP_MIB_CURRESTAB);
> -     }
> -
> -     /* Change state AFTER socket is unhashed to avoid closed
> -      * socket sitting in hash tables.
> -      */
> -     sk->sk_state = state;
> -
> -#ifdef STATE_TRACE
> -     SOCK_DEBUG(sk, "TCP sk=%p, State %s -> %s\n",sk, 
> statename[oldstate],statename[state]);
> -#endif       
> -}
>


Since the function is called with a constant state, I guess the assumption
was that gcc would be smart enough to only include the code needed, it looks 
like
either code was bigger or the compiler was dumber than expected

-- 
Stephen Hemminger <[EMAIL PROTECTED]>

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to