From: Petri Savolainen <petri.savolai...@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.savolai...@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(-) 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);