neigh: reorder struct neighbour fields
authorEric Dumazet <eric.dumazet@gmail.com>
Mon, 11 Oct 2010 12:20:54 +0000 (12:20 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 11 Oct 2010 23:09:14 +0000 (16:09 -0700)
Le mardi 12 octobre 2010 à 00:02 +0200, Eric Dumazet a écrit :
> Here is the followup patch.
>
> Thanks !
>

Oops, this was an old version, the up2date ones also took care of "used"
field.

I guess its time for a sleep, sorry again.

[PATCH net-next V2] neigh: reorder struct neighbour fields

(refcnt) and (ha_lock, ha, used, dev, output, ops, primary_key) should
be placed on a separate cache lines.

refcnt can be often written, while other fields are mostly read.

This gave me good result on stress test :

before:

real    0m45.570s
user    0m15.525s
sys     9m56.669s

After:

real    0m41.841s
user    0m15.261s
sys     8m45.949s

Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/neighbour.h

index f04e7a2522c51557ce9d10dca421fad7a9e123e3..55590ab16b3ed5192413b4b6415a8785c1d1a5bb 100644 (file)
@@ -94,8 +94,6 @@ struct neighbour {
        struct neighbour __rcu  *next;
        struct neigh_table      *tbl;
        struct neigh_parms      *parms;
-       struct net_device       *dev;
-       unsigned long           used;
        unsigned long           confirmed;
        unsigned long           updated;
        __u8                    flags;
@@ -103,16 +101,18 @@ struct neighbour {
        __u8                    type;
        __u8                    dead;
        atomic_t                refcnt;
+       struct sk_buff_head     arp_queue;
+       struct timer_list       timer;
+       unsigned long           used;
        atomic_t                probes;
        rwlock_t                lock;
        seqlock_t               ha_lock;
        unsigned char           ha[ALIGN(MAX_ADDR_LEN, sizeof(unsigned long))];
        struct hh_cache         *hh;
        int                     (*output)(struct sk_buff *skb);
-       struct sk_buff_head     arp_queue;
-       struct timer_list       timer;
        const struct neigh_ops  *ops;
        struct rcu_head         rcu;
+       struct net_device       *dev;
        u8                      primary_key[0];
 };