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);

Reply via email to