From: Pavan Nikhilesh <pbhagavat...@marvell.com>

Use em vector path to process event vector.
Signed-off-by: Pavan Nikhilesh <pbhagavat...@marvell.com>
---
 examples/l3fwd/l3fwd_em.c            | 10 ++--
 examples/l3fwd/l3fwd_em_hlm.h        | 72 +++++-----------------------
 examples/l3fwd/l3fwd_em_sequential.h | 25 ++++++----
 examples/l3fwd/l3fwd_event.h         | 21 --------
 4 files changed, 35 insertions(+), 93 deletions(-)

diff --git a/examples/l3fwd/l3fwd_em.c b/examples/l3fwd/l3fwd_em.c
index 10be24c61d..ac475073d7 100644
--- a/examples/l3fwd/l3fwd_em.c
+++ b/examples/l3fwd/l3fwd_em.c
@@ -852,10 +852,15 @@ em_event_loop_vector(struct l3fwd_event_resources 
*evt_rsrc,
        int i, nb_enq = 0, nb_deq = 0;
        struct lcore_conf *lconf;
        unsigned int lcore_id;
+       uint16_t *dst_ports;
 
        if (event_p_id < 0)
                return;
 
+       dst_ports = rte_zmalloc("", sizeof(uint16_t) * evt_rsrc->vector_size,
+                               RTE_CACHE_LINE_SIZE);
+       if (dst_ports == NULL)
+               return;
        lcore_id = rte_lcore_id();
        lconf = &lcore_conf[lcore_id];
 
@@ -877,13 +882,12 @@ em_event_loop_vector(struct l3fwd_event_resources 
*evt_rsrc,
                        }
 
 #if defined RTE_ARCH_X86 || defined __ARM_NEON
-                       l3fwd_em_process_event_vector(events[i].vec, lconf);
+                       l3fwd_em_process_event_vector(events[i].vec, lconf,
+                                                     dst_ports);
 #else
                        l3fwd_em_no_opt_process_event_vector(events[i].vec,
                                                             lconf);
 #endif
-                       if (flags & L3FWD_EVENT_TX_DIRECT)
-                               event_vector_txq_set(events[i].vec, 0);
                }
 
                if (flags & L3FWD_EVENT_TX_ENQ) {
diff --git a/examples/l3fwd/l3fwd_em_hlm.h b/examples/l3fwd/l3fwd_em_hlm.h
index 12b997e477..2e11eefad7 100644
--- a/examples/l3fwd/l3fwd_em_hlm.h
+++ b/examples/l3fwd/l3fwd_em_hlm.h
@@ -332,70 +332,20 @@ l3fwd_em_process_events(int nb_rx, struct rte_event **ev,
 
 static inline void
 l3fwd_em_process_event_vector(struct rte_event_vector *vec,
-                             struct lcore_conf *qconf)
+                             struct lcore_conf *qconf, uint16_t *dst_port)
 {
-       struct rte_mbuf **mbufs = vec->mbufs;
-       uint16_t dst_port[MAX_PKT_BURST];
-       int32_t i, j, n, pos;
-
-       for (j = 0; j < EM_HASH_LOOKUP_COUNT && j < vec->nb_elem; j++)
-               rte_prefetch0(
-                       rte_pktmbuf_mtod(mbufs[j], struct rte_ether_hdr *) + 1);
+       uint16_t i;
 
        if (vec->attr_valid)
-               vec->port = em_get_dst_port(qconf, mbufs[0], mbufs[0]->port);
-
-       n = RTE_ALIGN_FLOOR(vec->nb_elem, EM_HASH_LOOKUP_COUNT);
-       for (j = 0; j < n; j += EM_HASH_LOOKUP_COUNT) {
-               uint32_t pkt_type =
-                       RTE_PTYPE_L3_MASK | RTE_PTYPE_L4_TCP | RTE_PTYPE_L4_UDP;
-               uint32_t l3_type, tcp_or_udp;
-
-               for (i = 0; i < EM_HASH_LOOKUP_COUNT; i++)
-                       pkt_type &= mbufs[j + i]->packet_type;
-
-               l3_type = pkt_type & RTE_PTYPE_L3_MASK;
-               tcp_or_udp = pkt_type & (RTE_PTYPE_L4_TCP | RTE_PTYPE_L4_UDP);
-
-               for (i = 0, pos = j + EM_HASH_LOOKUP_COUNT;
-                    i < EM_HASH_LOOKUP_COUNT && pos < vec->nb_elem;
-                    i++, pos++) {
-                       rte_prefetch0(rte_pktmbuf_mtod(mbufs[pos],
-                                                      struct rte_ether_hdr *) +
-                                     1);
-               }
-
-               if (tcp_or_udp && (l3_type == RTE_PTYPE_L3_IPV4)) {
-                       em_get_dst_port_ipv4xN_events(qconf, &mbufs[j],
-                                                     &dst_port[j]);
-               } else if (tcp_or_udp && (l3_type == RTE_PTYPE_L3_IPV6)) {
-                       em_get_dst_port_ipv6xN_events(qconf, &mbufs[j],
-                                                     &dst_port[j]);
-               } else {
-                       for (i = 0; i < EM_HASH_LOOKUP_COUNT; i++) {
-                               mbufs[j + i]->port =
-                                       em_get_dst_port(qconf, mbufs[j + i],
-                                                       mbufs[j + i]->port);
-                               process_packet(mbufs[j + i],
-                                              &mbufs[j + i]->port);
-                               event_vector_attr_validate(vec, mbufs[j + i]);
-                       }
-                       continue;
-               }
-               processx4_step3(&mbufs[j], &dst_port[j]);
-
-               for (i = 0; i < EM_HASH_LOOKUP_COUNT; i++) {
-                       mbufs[j + i]->port = dst_port[j + i];
-                       event_vector_attr_validate(vec, mbufs[j + i]);
-               }
-       }
-
-       for (; j < vec->nb_elem; j++) {
-               mbufs[j]->port =
-                       em_get_dst_port(qconf, mbufs[j], mbufs[j]->port);
-               process_packet(mbufs[j], &mbufs[j]->port);
-               event_vector_attr_validate(vec, mbufs[j]);
-       }
+               l3fwd_em_process_packets(vec->nb_elem, vec->mbufs, dst_port,
+                                        vec->port, qconf, 1);
+       else
+               for (i = 0; i < vec->nb_elem; i++)
+                       l3fwd_em_process_packets(1, &vec->mbufs[i],
+                                                &dst_port[i],
+                                                vec->mbufs[i]->port, qconf, 1);
+
+       process_event_vector(vec, dst_port);
 }
 
 #endif /* __L3FWD_EM_HLM_H__ */
diff --git a/examples/l3fwd/l3fwd_em_sequential.h 
b/examples/l3fwd/l3fwd_em_sequential.h
index d2f75edb8a..067f23889a 100644
--- a/examples/l3fwd/l3fwd_em_sequential.h
+++ b/examples/l3fwd/l3fwd_em_sequential.h
@@ -113,39 +113,48 @@ l3fwd_em_process_events(int nb_rx, struct rte_event 
**events,
 
        for (i = 1, j = 0; j < nb_rx; i++, j++) {
                struct rte_mbuf *mbuf = events[j]->mbuf;
+               uint16_t port;
 
                if (i < nb_rx) {
                        rte_prefetch0(rte_pktmbuf_mtod(
                                        events[i]->mbuf,
                                        struct rte_ether_hdr *) + 1);
                }
+               port = mbuf->port;
                mbuf->port = em_get_dst_port(qconf, mbuf, mbuf->port);
                process_packet(mbuf, &mbuf->port);
+               if (mbuf->port == BAD_PORT)
+                       mbuf->port = port;
        }
 }
 
 static inline void
 l3fwd_em_process_event_vector(struct rte_event_vector *vec,
-                             struct lcore_conf *qconf)
+                             struct lcore_conf *qconf, uint16_t *dst_ports)
 {
+       const uint8_t attr_valid = vec->attr_valid;
        struct rte_mbuf **mbufs = vec->mbufs;
        int32_t i, j;
 
        rte_prefetch0(rte_pktmbuf_mtod(mbufs[0], struct rte_ether_hdr *) + 1);
 
-       if (vec->attr_valid)
-               vec->port = em_get_dst_port(qconf, mbufs[0], mbufs[0]->port);
-
        for (i = 0, j = 1; i < vec->nb_elem; i++, j++) {
                if (j < vec->nb_elem)
                        rte_prefetch0(rte_pktmbuf_mtod(mbufs[j],
                                                       struct rte_ether_hdr *) +
                                      1);
-               mbufs[i]->port =
-                       em_get_dst_port(qconf, mbufs[i], mbufs[i]->port);
-               process_packet(mbufs[i], &mbufs[i]->port);
-               event_vector_attr_validate(vec, mbufs[i]);
+               dst_ports[i] = em_get_dst_port(qconf, mbufs[i],
+                                              attr_valid ? vec->port :
+                                                           mbufs[i]->port);
        }
+       j = RTE_ALIGN_FLOOR(vec->nb_elem, FWDSTEP);
+
+       for (i = 0; i != j; i += FWDSTEP)
+               processx4_step3(&vec->mbufs[i], &dst_ports[i]);
+       for (; i < vec->nb_elem; i++)
+               process_packet(vec->mbufs[i], &dst_ports[i]);
+
+       process_event_vector(vec, dst_ports);
 }
 
 #endif /* __L3FWD_EM_SEQUENTIAL_H__ */
diff --git a/examples/l3fwd/l3fwd_event.h b/examples/l3fwd/l3fwd_event.h
index 26c3254004..2844cc4dd6 100644
--- a/examples/l3fwd/l3fwd_event.h
+++ b/examples/l3fwd/l3fwd_event.h
@@ -90,27 +90,6 @@ struct l3fwd_event_resources {
        uint64_t vector_tmo_ns;
 };
 
-static inline void
-event_vector_attr_validate(struct rte_event_vector *vec, struct rte_mbuf *mbuf)
-{
-       /* l3fwd application only changes mbuf port while processing */
-       if (vec->attr_valid && (vec->port != mbuf->port))
-               vec->attr_valid = 0;
-}
-
-static inline void
-event_vector_txq_set(struct rte_event_vector *vec, uint16_t txq)
-{
-       if (vec->attr_valid) {
-               vec->queue = txq;
-       } else {
-               int i;
-
-               for (i = 0; i < vec->nb_elem; i++)
-                       rte_event_eth_tx_adapter_txq_set(vec->mbufs[i], txq);
-       }
-}
-
 static inline uint16_t
 filter_bad_packets(struct rte_mbuf **mbufs, uint16_t *dst_port,
                   uint16_t nb_pkts)
-- 
2.25.1

Reply via email to