diff mbox

net: reorder fields of struct socket

Message ID 49BB72FA.1080401@cosmosbay.com
State Accepted, archived
Delegated to: David Miller
Headers show

Commit Message

Eric Dumazet March 14, 2009, 9:03 a.m. UTC
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>


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

Comments

David Miller March 16, 2009, 2:59 a.m. UTC | #1
From: Eric Dumazet <dada1@cosmosbay.com>
Date: Sat, 14 Mar 2009 10:03:54 +0100

> 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>

Applied, thanks a lot Eric.
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/include/linux/net.h b/include/linux/net.h
index 4515efa..4fc2ffd 100644
--- a/include/linux/net.h
+++ b/include/linux/net.h
@@ -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;