[ovs-dev] [PATCH v2] packets: Prefetch the packet metadata in cacheline1.
Chandran, Sugesh
sugesh.chandran at intel.com
Wed Dec 6 12:47:38 UTC 2017
Tested on Intel Haswell platform and Acked!
(Provided there are no performance regression are reported so far on other platforms for various tests too)
Regards
_Sugesh
> -----Original Message-----
> From: Bodireddy, Bhanuprakash
> Sent: Monday, December 4, 2017 8:10 PM
> To: dev at openvswitch.org
> Cc: Chandran, Sugesh <sugesh.chandran at intel.com>; Bodireddy, Bhanuprakash
> <bhanuprakash.bodireddy at intel.com>; Ben Pfaff <blp at ovn.org>
> Subject: [PATCH v2] packets: Prefetch the packet metadata in cacheline1.
>
> pkt_metadata_prefetch_init() is used to prefetch the packet metadata before
> initializing the metadata in pkt_metadata_init(). This is done for every packet in
> userspace datapath and is performance critical.
>
> Commit 99fc16c0 prefetches only cachline0 and cacheline2 as the metadata
> part of respective cachelines will be initialized by pkt_metadata_init().
>
> However in VXLAN case when popping the vxlan header,
> netdev_vxlan_pop_header() invokes pkt_metadata_init_tnl() which zeroes out
> metadata part of
> cacheline1 that wasn't prefetched earlier and causes performance degradation.
>
> By prefetching cacheline1, 9% performance improvement is observed with vxlan
> decapsulation test case for packet sizes of 118 bytes. Performance variation is
> observed based on CFLAGS.
>
> CFLAGS="-O2" CFLAGS="-O2 -msse4.2"
> Master 4.667 Mpps Master 4.710 Mpps
> With Patch 5.045 Mpps With Patch 5.097 Mpps
>
> CFLAGS="-O2 -march=native" CFLAGS="-Ofast -march=native"
> Master 5.072 Mpps Master 5.349 Mpps
> With Patch 5.193 Mpps With Patch 5.378 Mpps
>
> CC: Ben Pfaff <blp at ovn.org>
> Fixes: 99fc16c0 ("Reorganize the pkt_metadata structure.")
> Signed-off-by: Bhanuprakash Bodireddy <bhanuprakash.bodireddy at intel.com>
> ---
> v2->v1
> * Include the throughput stats with different CFLAG options.
>
> lib/packets.h | 7 ++++++-
> 1 file changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/lib/packets.h b/lib/packets.h index 13ea46d..74bec5d 100644
> --- a/lib/packets.h
> +++ b/lib/packets.h
> @@ -159,7 +159,8 @@ pkt_metadata_init(struct pkt_metadata *md,
> odp_port_t port) }
>
> /* This function prefetches the cachelines touched by pkt_metadata_init()
> - * For performance reasons the two functions should be kept in sync. */
> + * and pkt_metadata_init_tnl(). For performance reasons the two
> + functions
> + * should be kep in sync. */
> static inline void
> pkt_metadata_prefetch_init(struct pkt_metadata *md) { @@ -167,6 +168,10
> @@ pkt_metadata_prefetch_init(struct pkt_metadata *md)
> * be initialized later in pkt_metadata_init(). */
> OVS_PREFETCH(md->cacheline0);
>
> + /* Prefetch cacheline1 as members of this cacheline will be zeroed out
> + * in pkt_metadata_init_tnl(). */
> + OVS_PREFETCH(md->cacheline1);
> +
> /* Prefetch cachline2 as ip_dst & ipv6_dst fields will be initialized. */
> OVS_PREFETCH(md->cacheline2);
> }
> --
> 2.4.11
More information about the dev
mailing list