af_packet: Avoid cache line dirtying
authorEric Dumazet <eric.dumazet@gmail.com>
Fri, 16 Oct 2009 04:02:20 +0000 (04:02 +0000)
committerDavid S. Miller <davem@davemloft.net>
Tue, 20 Oct 2009 08:02:06 +0000 (01:02 -0700)
While doing multiple captures, I found af_packet was dirtying cache line
containing its prot_hook.

This slow down machines where several cpus are necessary to handle capture
traffic, as each prot_hook is traversed for each packet coming in or out
the host.

This patches moves "struct packet_type prot_hook" to the end of
packet_sock, and uses a ____cacheline_aligned_in_smp to make sure
this remains shared by all cpus.

Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/packet/af_packet.c

index bf3a2954cd4d2c9a7ba0ce6e89bd5aaa25301b60..dac775e0bc72a196f18570552409a25b9a0181af 100644 (file)
@@ -188,7 +188,6 @@ struct packet_sock {
        struct packet_ring_buffer       tx_ring;
        int                     copy_thresh;
 #endif
-       struct packet_type      prot_hook;
        spinlock_t              bind_lock;
        struct mutex            pg_vec_lock;
        unsigned int            running:1,      /* prot_hook is attached*/
@@ -204,6 +203,7 @@ struct packet_sock {
        unsigned int            tp_reserve;
        unsigned int            tp_loss:1;
 #endif
+       struct packet_type      prot_hook ____cacheline_aligned_in_smp;
 };
 
 struct packet_skb_cb {