On 03/23/2017 04:44 PM, Kevin Traynor wrote:
The broadcast_rarp field in the virtio_net struct is checked in the
dequeue datapath regardless of whether descriptors are available or not.
As it is checked with cmpset leading to a write, false sharing on the
virtio_net struct can happen between enqueue and dequeue datapaths
regardless of whether a RARP is requested. In OVS, the issue can cause
a uni-directional performance drop of up to 15%.
Fix that by only performing the cmpset if a read of broadcast_rarp
indicates that the cmpset is likely to succeed.
Fixes: a66bcad32240 ("vhost: arrange struct fields for better cache sharing")
Cc: [email protected]
Signed-off-by: Kevin Traynor <[email protected]>
---
V2:
Change from fixing by moving broadcast_rarp location in virtio_net struct
to performing a read before cmpset.
lib/librte_vhost/virtio_net.c | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
Nice!
Reviewed-by: Maxime Coquelin <[email protected]>
I'll try to benchmark it with testpmd only to see if we measure the
same gain without OVS.
Thanks,
Maxime