[v1,4/4] linux-gen: dpdk: optimize mbuf_to_pkt

Message ID 1518102010-6353-5-git-send-email-odpbot@yandex.ru
State New
Headers show
Series
  • Parser optimizations
Related show

Commit Message

Github ODP bot Feb. 8, 2018, 3 p.m.
From: Petri Savolainen <petri.savolainen@linaro.org>


Optimize mbuf to packet functions. Read data from pktio
structure only once. Prefetch data also in zero copy mode.

Signed-off-by: Petri Savolainen <petri.savolainen@linaro.org>

---
/** Email created from pull request 461 (psavol:master-parse-optim)
 ** https://github.com/Linaro/odp/pull/461
 ** Patch: https://github.com/Linaro/odp/pull/461.patch
 ** Base sha: 257b08b35ceea41bad5a7f1c626496cf111e657a
 ** Merge commit sha: e004cabc6971bf41b8674db708fd8eaa543f7dae
 **/
 platform/linux-generic/pktio/dpdk.c | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)

Patch

diff --git a/platform/linux-generic/pktio/dpdk.c b/platform/linux-generic/pktio/dpdk.c
index bd6920e6a..643a8e9b0 100644
--- a/platform/linux-generic/pktio/dpdk.c
+++ b/platform/linux-generic/pktio/dpdk.c
@@ -433,6 +433,8 @@  static inline int mbuf_to_pkt(pktio_entry_t *pktio_entry,
 	int alloc_len, num;
 	odp_pool_t pool = pktio_entry->s.pkt_dpdk.pool;
 	odp_pktin_config_opt_t *pktin_cfg = &pktio_entry->s.config.pktin;
+	odp_proto_layer_t parse_layer = pktio_entry->s.config.parser.layer;
+	odp_pktio_t input = pktio_entry->s.handle;
 
 	/* Allocate maximum sized packets */
 	alloc_len = pktio_entry->s.pkt_dpdk.data_room;
@@ -474,13 +476,12 @@  static inline int mbuf_to_pkt(pktio_entry_t *pktio_entry,
 		if (_odp_packet_copy_from_mem(pkt, 0, pkt_len, data) != 0)
 			goto fail;
 
-		pkt_hdr->input = pktio_entry->s.handle;
+		pkt_hdr->input = input;
 
 		if (pktio_cls_enabled(pktio_entry))
 			copy_packet_cls_metadata(&parsed_hdr, pkt_hdr);
-		else if (pktio_entry->s.config.parser.layer)
-			packet_parse_layer(pkt_hdr,
-					   pktio_entry->s.config.parser.layer);
+		else if (parse_layer != ODP_PROTO_LAYER_NONE)
+			packet_parse_layer(pkt_hdr, parse_layer);
 
 		if (mbuf->ol_flags & PKT_RX_RSS_HASH)
 			packet_set_flow_hash(pkt_hdr, mbuf->hash.rss);
@@ -682,6 +683,8 @@  static inline int mbuf_to_pkt_zero(pktio_entry_t *pktio_entry,
 	int nb_pkts = 0;
 	odp_pool_t pool = pktio_entry->s.pkt_dpdk.pool;
 	odp_pktin_config_opt_t *pktin_cfg = &pktio_entry->s.config.pktin;
+	odp_proto_layer_t parse_layer = pktio_entry->s.config.parser.layer;
+	odp_pktio_t input = pktio_entry->s.handle;
 
 	for (i = 0; i < mbuf_num; i++) {
 		odp_packet_hdr_t parsed_hdr;
@@ -694,6 +697,8 @@  static inline int mbuf_to_pkt_zero(pktio_entry_t *pktio_entry,
 		}
 
 		data = rte_pktmbuf_mtod(mbuf, char *);
+		odp_prefetch(data);
+
 		pkt_len = rte_pktmbuf_pkt_len(mbuf);
 
 		pkt = (odp_packet_t)mbuf->userdata;
@@ -714,13 +719,12 @@  static inline int mbuf_to_pkt_zero(pktio_entry_t *pktio_entry,
 		pkt_hdr->buf_hdr.seg[0].data = data;
 
 		packet_init(pkt_hdr, pkt_len);
-		pkt_hdr->input = pktio_entry->s.handle;
+		pkt_hdr->input = input;
 
 		if (pktio_cls_enabled(pktio_entry))
 			copy_packet_cls_metadata(&parsed_hdr, pkt_hdr);
-		else if (pktio_entry->s.config.parser.layer)
-			packet_parse_layer(pkt_hdr,
-					   pktio_entry->s.config.parser.layer);
+		else if (parse_layer != ODP_PROTO_LAYER_NONE)
+			packet_parse_layer(pkt_hdr, parse_layer);
 
 		if (mbuf->ol_flags & PKT_RX_RSS_HASH)
 			packet_set_flow_hash(pkt_hdr, mbuf->hash.rss);