net: cacheline adjust struct inet_frags for better frag performance
authorJesper Dangaard Brouer <brouer@redhat.com>
Mon, 28 Jan 2013 23:44:37 +0000 (23:44 +0000)
committerDavid S. Miller <davem@davemloft.net>
Tue, 29 Jan 2013 18:36:23 +0000 (13:36 -0500)
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>
include/net/inet_frag.h

index 91e7797..54c1de7 100644 (file)
@@ -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);
 };