tun: align write-heavy flow entry members to a cache line
tun flow entry 'updated' fields are written when receive every packet. Thus if a flow is receiving packets from a particular flow entry, it'll cause false-sharing with all the other who has looked it up, so move it in its own cache line and update 'queue_index' and 'update' field only when they are changed to reduce the cache false-sharing. Signed-off-by: Zhang Yu <zhangyu31@baidu.com> Signed-off-by: Wang Li <wangli39@baidu.com> Signed-off-by: Li RongQing <lirongqing@baidu.com> Acked-by: Jason Wang <jasowang@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
7a35a50df5
commit
83b1bc122c
|
@ -201,7 +201,7 @@ struct tun_flow_entry {
|
|||
u32 rxhash;
|
||||
u32 rps_rxhash;
|
||||
int queue_index;
|
||||
unsigned long updated;
|
||||
unsigned long updated ____cacheline_aligned_in_smp;
|
||||
};
|
||||
|
||||
#define TUN_NUM_FLOW_ENTRIES 1024
|
||||
|
@ -539,8 +539,10 @@ static void tun_flow_update(struct tun_struct *tun, u32 rxhash,
|
|||
e = tun_flow_find(head, rxhash);
|
||||
if (likely(e)) {
|
||||
/* TODO: keep queueing to old queue until it's empty? */
|
||||
e->queue_index = queue_index;
|
||||
e->updated = jiffies;
|
||||
if (e->queue_index != queue_index)
|
||||
e->queue_index = queue_index;
|
||||
if (e->updated != jiffies)
|
||||
e->updated = jiffies;
|
||||
sock_rps_record_flow_hash(e->rps_rxhash);
|
||||
} else {
|
||||
spin_lock_bh(&tun->lock);
|
||||
|
|
Loading…
Reference in New Issue