net: reorder fields of struct socket
authorEric Dumazet <dada1@cosmosbay.com>
Mon, 16 Mar 2009 02:59:13 +0000 (19:59 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 16 Mar 2009 02:59:13 +0000 (19:59 -0700)
On x86_64, its rather unfortunate that "wait_queue_head_t wait"
field of "struct socket" spans two cache lines (assuming a 64
bytes cache line in current cpus)

offsetof(struct socket, wait)=0x30
sizeof(wait_queue_head_t)=0x18

This might explain why Kenny Chang noticed that his multicast workload
was performing bad with 64 bit kernels, since more cache lines ping pongs
were involved.

This litle patch moves "wait" field next "fasync_list" so that both
fields share a single cache line, to speedup sock_def_readable()

Signed-off-by: Eric Dumazet <dada1@cosmosbay.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/net.h

index 4515efae4c392bf1c33441159163a04ba80a3ff6..4fc2ffd527f9386e613afe1e54a552268a491eb5 100644 (file)
@@ -129,11 +129,15 @@ struct socket {
        socket_state            state;
        short                   type;
        unsigned long           flags;
-       const struct proto_ops  *ops;
+       /*
+        * Please keep fasync_list & wait fields in the same cache line
+        */
        struct fasync_struct    *fasync_list;
+       wait_queue_head_t       wait;
+
        struct file             *file;
        struct sock             *sk;
-       wait_queue_head_t       wait;
+       const struct proto_ops  *ops;
 };
 
 struct vm_area_struct;