forked from Minki/linux
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 rxhash;
|
||||||
u32 rps_rxhash;
|
u32 rps_rxhash;
|
||||||
int queue_index;
|
int queue_index;
|
||||||
unsigned long updated;
|
unsigned long updated ____cacheline_aligned_in_smp;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define TUN_NUM_FLOW_ENTRIES 1024
|
#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);
|
e = tun_flow_find(head, rxhash);
|
||||||
if (likely(e)) {
|
if (likely(e)) {
|
||||||
/* TODO: keep queueing to old queue until it's empty? */
|
/* TODO: keep queueing to old queue until it's empty? */
|
||||||
e->queue_index = queue_index;
|
if (e->queue_index != queue_index)
|
||||||
e->updated = jiffies;
|
e->queue_index = queue_index;
|
||||||
|
if (e->updated != jiffies)
|
||||||
|
e->updated = jiffies;
|
||||||
sock_rps_record_flow_hash(e->rps_rxhash);
|
sock_rps_record_flow_hash(e->rps_rxhash);
|
||||||
} else {
|
} else {
|
||||||
spin_lock_bh(&tun->lock);
|
spin_lock_bh(&tun->lock);
|
||||||
|
Loading…
Reference in New Issue
Block a user