Hi David, This saves 8 bytes out of struct sock in 64bit arches, tested on x86_64.
[EMAIL PROTECTED] linux-2.6]$ codiff sock.o.before net/core/sock.o /home/acme/git/linux-2.6/net/core/sock.c: struct sock | -8 1 struct changed [EMAIL PROTECTED] linux-2.6]$ Now struct sock has this layout, where we waste more 20 bytes, in four 4 byte paddings in struct skb_buff_head members (layout at the bottom) + one 4 bytes hole: [EMAIL PROTECTED] linux-2.6]$ pahole -C sock net/core/sock.o struct sock { struct sock_common __sk_common; /* 0 56 */ unsigned char sk_shutdown:2; /* 56 1 */ unsigned char sk_no_check:2; /* 56 1 */ unsigned char sk_userlocks:4; /* 56 1 */ unsigned char sk_protocol; /* 57 1 */ short unsigned int sk_type; /* 58 2 */ int sk_rcvbuf; /* 60 4 */ /* --- cacheline 1 boundary (64 bytes) --- */ socket_lock_t sk_lock; /* 64 40 */ struct { struct sk_buff * head; /* 104 8 */ struct sk_buff * tail; /* 112 8 */ } sk_backlog; /* 104 16 */ wait_queue_head_t * sk_sleep; /* 120 8 */ /* --- cacheline 2 boundary (128 bytes) --- */ struct dst_entry * sk_dst_cache; /* 128 8 */ struct xfrm_policy * sk_policy[2]; /* 136 16 */ rwlock_t sk_dst_lock; /* 152 8 */ atomic_t sk_rmem_alloc; /* 160 4 */ atomic_t sk_wmem_alloc; /* 164 4 */ atomic_t sk_omem_alloc; /* 168 4 */ int sk_sndbuf; /* 172 4 */ struct sk_buff_head sk_receive_queue; /* 176 32 */ /* XXX last struct has 4 bytes of padding */ /* --- cacheline 3 boundary (192 bytes) was 16 bytes ago --- */ struct sk_buff_head sk_write_queue; /* 208 32 */ /* XXX last struct has 4 bytes of padding */ struct sk_buff_head sk_async_wait_queue; /* 240 32 */ /* XXX last struct has 4 bytes of padding */ /* --- cacheline 4 boundary (256 bytes) was 16 bytes ago --- */ int sk_wmem_queued; /* 272 4 */ int sk_forward_alloc; /* 276 4 */ gfp_t sk_allocation; /* 280 4 */ int sk_route_caps; /* 284 4 */ int sk_gso_type; /* 288 4 */ int sk_rcvlowat; /* 292 4 */ long unsigned int sk_flags; /* 296 8 */ long unsigned int sk_lingertime; /* 304 8 */ struct sk_buff_head sk_error_queue; /* 312 32 */ /* XXX last struct has 4 bytes of padding */ /* --- cacheline 5 boundary (320 bytes) was 24 bytes ago --- */ struct proto * sk_prot_creator; /* 344 8 */ rwlock_t sk_callback_lock; /* 352 8 */ int sk_err; /* 360 4 */ int sk_err_soft; /* 364 4 */ short unsigned int sk_ack_backlog; /* 368 2 */ short unsigned int sk_max_ack_backlog; /* 370 2 */ __u32 sk_priority; /* 372 4 */ struct ucred sk_peercred; /* 376 12 */ /* XXX 4 bytes hole, try to pack */ /* --- cacheline 6 boundary (384 bytes) was 8 bytes ago --- */ long int sk_rcvtimeo; /* 392 8 */ long int sk_sndtimeo; /* 400 8 */ struct sk_filter * sk_filter; /* 408 8 */ void * sk_protinfo; /* 416 8 */ struct timer_list sk_timer; /* 424 48 */ /* --- cacheline 7 boundary (448 bytes) was 24 bytes ago --- */ ktime_t sk_stamp; /* 472 8 */ struct socket * sk_socket; /* 480 8 */ void * sk_user_data; /* 488 8 */ struct page * sk_sndmsg_page; /* 496 8 */ struct sk_buff * sk_send_head; /* 504 8 */ /* --- cacheline 8 boundary (512 bytes) --- */ __u32 sk_sndmsg_off; /* 512 4 */ int sk_write_pending; /* 516 4 */ void * sk_security; /* 520 8 */ void (*sk_state_change)(struct sock *); /* 528 8 */ void (*sk_data_ready)(struct sock *, int); /* 536 8 */ void (*sk_write_space)(struct sock *); /* 544 8 */ void (*sk_error_report)(struct sock *); /* 552 8 */ int (*sk_backlog_rcv)(struct sock *, struct sk_buff *); /* 560 8 */ void (*sk_destruct)(struct sock *); /* 568 8 */ /* --- cacheline 9 boundary (576 bytes) --- */ }; /* size: 576, cachelines: 9 */ /* sum members: 572, holes: 1, sum holes: 4 */ /* paddings: 4, sum paddings: 16 */ [EMAIL PROTECTED] linux-2.6]$ pahole -C sk_buff_head net/core/sock.o struct sk_buff_head { struct sk_buff * next; /* 0 8 */ struct sk_buff * prev; /* 8 8 */ __u32 qlen; /* 16 4 */ spinlock_t lock; /* 20 8 */ }; /* size: 32, cachelines: 1 */ /* padding: 4 */ /* last cacheline: 32 bytes */ Signed-off-by: Arnaldo Carvalho de Melo <[EMAIL PROTECTED]> --- diff --git a/include/net/sock.h b/include/net/sock.h index 25c37e3..64a5429 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -218,13 +218,13 @@ struct sock { atomic_t sk_rmem_alloc; atomic_t sk_wmem_alloc; atomic_t sk_omem_alloc; + int sk_sndbuf; struct sk_buff_head sk_receive_queue; struct sk_buff_head sk_write_queue; struct sk_buff_head sk_async_wait_queue; int sk_wmem_queued; int sk_forward_alloc; gfp_t sk_allocation; - int sk_sndbuf; int sk_route_caps; int sk_gso_type; int sk_rcvlowat; - 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