From af697f26b51b67fb4b8db8358bb4c6268bcce0f4 Mon Sep 17 00:00:00 2001 From: Daniele Di Proietto Date: Tue, 1 Aug 2017 17:26:28 -0700 Subject: [PATCH] packets: Do not initialize ct_orig_tuple. Commit "odp: Support conntrack orig tuple key." introduced new fields in struct 'pkt_metadata'. pkt_metadata_init() is called for every packet in the userspace datapath. When testing a simple single flow case with DPDK, we observe a lower throughput after the above commit (it was 14.88 Mpps before, it is 13 Mpps after). This patch skips initializing ct_orig_tuple in pkt_metadata_init(). It should be enough to initialize ct_state, because nobody should look at ct_orig_tuple unless ct_state is != 0. It's discussed at: https://mail.openvswitch.org/pipermail/ovs-dev/2017-May/332419.html Fixes: daf4d3c18da4("odp: Support conntrack orig tuple key.") Signed-off-by: Daniele Di Proietto Signed-off-by: Bhanuprakash Bodireddy Co-authored-by: Bhanuprakash Bodireddy Signed-off-by: Darrell Ball Signed-off-by: Ben Pfaff --- lib/packets.h | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/packets.h b/lib/packets.h index a9d5e844e..8c9c741fa 100644 --- a/lib/packets.h +++ b/lib/packets.h @@ -126,10 +126,18 @@ pkt_metadata_init_tnl(struct pkt_metadata *md) static inline void pkt_metadata_init(struct pkt_metadata *md, odp_port_t port) { + /* This is called for every packet in userspace datapath and affects + * performance if all the metadata is initialized. Hence, fields should + * only be zeroed out when necessary. + * + * Initialize only till ct_state. Once the ct_state is zeroed out rest + * of ct fields will not be looked at unless ct_state != 0. + */ + memset(md, 0, offsetof(struct pkt_metadata, ct_orig_tuple_ipv6)); + /* It can be expensive to zero out all of the tunnel metadata. However, * we can just zero out ip_dst and the rest of the data will never be * looked at. */ - memset(md, 0, offsetof(struct pkt_metadata, in_port)); md->tunnel.ip_dst = 0; md->tunnel.ipv6_dst = in6addr_any; md->in_port.odp_port = port;