diff options
author | Jesper Dangaard Brouer <brouer@redhat.com> | 2013-01-29 03:44:37 +0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-01-29 22:36:23 +0400 |
commit | 5f8e1e8b767bdb8e471d4f49612b88c606f8811e (patch) | |
tree | ce54f4695fd3bc8b400dd28ed965de9cfa202cd6 /include | |
parent | cd39a7890aed7433beb3188c7ad8591e260ebf10 (diff) | |
download | linux-5f8e1e8b767bdb8e471d4f49612b88c606f8811e.tar.xz |
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 <brouer@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include')
-rw-r--r-- | include/net/inet_frag.h | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/include/net/inet_frag.h b/include/net/inet_frag.h index 91e77975eaa6..54c1de781c68 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); }; |