OVS_PREFETCH by default uses OPCH_HTR(High Temporal Read), meaning the prefetch is in preparation for a future read and the prefetched data is made available in all levels of caches.
However the pkt_metadata_prefetch_init() prefetches the metadata so that the data is readily available when pkt_metadata_init() zeroes out the same. So a 'write' operation is actually performed instead of anticipated 'read' on the prefetched data. Doing a 'write' isn't a problem as the metadata isn't shared between the threads and doesn't need invalidation across other cores and so read prefetch is enough with *non-temporal* reference so not to pollute the cache. This change seems to positively affect performance. Signed-off-by: Bhanuprakash Bodireddy <bhanuprakash.bodire...@intel.com> --- lib/packets.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/packets.h b/lib/packets.h index 9a71aa3..5f50fe2 100644 --- a/lib/packets.h +++ b/lib/packets.h @@ -166,14 +166,14 @@ pkt_metadata_prefetch_init(struct pkt_metadata *md) { /* Prefetch cacheline0 as members till ct_state and odp_port will * be initialized later in pkt_metadata_init(). */ - OVS_PREFETCH(md->cacheline0); + OVS_PREFETCH_CACHE(md->cacheline0, OPCH_NTR); /* Prefetch cacheline1 as members of this cacheline will be zeroed out * in pkt_metadata_init_tnl(). */ - OVS_PREFETCH(md->cacheline1); + OVS_PREFETCH_CACHE(md->cacheline1, OPCH_NTR); /* Prefetch cachline2 as ip_dst & ipv6_dst fields will be initialized. */ - OVS_PREFETCH(md->cacheline2); + OVS_PREFETCH_CACHE(md->cacheline2, OPCH_NTR); } bool dpid_from_string(const char *s, uint64_t *dpidp); -- 2.4.11 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev