From: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
To: "David S. Miller" <davem@davemloft.net>
Cc: netdev@vger.kernel.org
Subject: [PATCH][SOCK]: shrink struct sock
Date: Fri, 4 May 2007 01:11:01 -0300 [thread overview]
Message-ID: <20070504041101.GA27519@ghostprotocols.net> (raw)
Hi David,
This saves 8 bytes out of struct sock in 64bit arches, tested on x86_64.
[acme@mica 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
[acme@mica 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:
[acme@mica 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 */
[acme@mica 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 <acme@redhat.com>
---
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;
next reply other threads:[~2007-05-04 4:11 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-05-04 4:11 Arnaldo Carvalho de Melo [this message]
2007-05-04 4:22 ` [PATCH][SOCK]: shrink struct sock David Miller
2007-05-04 10:17 ` Ian McDonald
2007-05-04 6:10 ` Eric Dumazet
2007-05-04 11:24 ` Arnaldo Carvalho de Melo
2007-05-04 12:24 ` Eric Dumazet
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20070504041101.GA27519@ghostprotocols.net \
--to=acme@ghostprotocols.net \
--cc=davem@davemloft.net \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.