From: Jesper Dangaard Brouer Date: Mon, 28 Jan 2013 23:44:37 +0000 (+0000) Subject: net: cacheline adjust struct inet_frags for better frag performance X-Git-Tag: v3.9-rc1~139^2~232^2~4 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5f8e1e8b767bdb8e471d4f49612b88c606f8811e;p=platform%2Fkernel%2Flinux-stable.git net: cacheline adjust struct inet_frags for better frag performance The globally shared rwlock, of struct inet_frags, shares cacheline with the 'rnd' number, which is used by the hash calculations. Fix this, as this obviously is a bad idea, as unnecessary cache-misses will occur when accessing the 'rnd' number. Also small note that, moving function ptr (*match) up in struct, is to avoid it lands on the next cacheline (on 64-bit). Signed-off-by: Jesper Dangaard Brouer Signed-off-by: David S. Miller --- diff --git a/include/net/inet_frag.h b/include/net/inet_frag.h index 91e7797..54c1de7 100644 --- a/include/net/inet_frag.h +++ b/include/net/inet_frag.h @@ -40,18 +40,21 @@ struct inet_frag_queue { struct inet_frags { struct hlist_head hash[INETFRAGS_HASHSZ]; - rwlock_t lock; - u32 rnd; - int qsize; + /* This rwlock is a global lock (seperate per IPv4, IPv6 and + * netfilter). Important to keep this on a seperate cacheline. + */ + rwlock_t lock ____cacheline_aligned_in_smp; int secret_interval; struct timer_list secret_timer; + u32 rnd; + int qsize; unsigned int (*hashfn)(struct inet_frag_queue *); + bool (*match)(struct inet_frag_queue *q, void *arg); void (*constructor)(struct inet_frag_queue *q, void *arg); void (*destructor)(struct inet_frag_queue *); void (*skb_free)(struct sk_buff *); - bool (*match)(struct inet_frag_queue *q, void *arg); void (*frag_expire)(unsigned long data); };