On Thu, Oct 15, 2020 at 11:38:13AM +0100, Ciara Power wrote: > External Email > > ---------------------------------------------------------------------- > When choosing the vector path, max SIMD bitwidth is now checked to > ensure the vector path is suitable. To do this, the scalar function is > chosen by default in the struct, but at node initialisation time, this > function pointer is updated to the vector version if supported, and > if it is within the max SIMD bitwidth limit. > > Cc: Nithin Dabilpuram <ndabilpu...@marvell.com> > Cc: Pavan Nikhilesh <pbhagavat...@marvell.com> > Cc: Jerin Jacob <jer...@marvell.com> > Cc: Kiran Kumar K <kirankum...@marvell.com> > > Signed-off-by: Ciara Power <ciara.po...@intel.com> > > --- > v6: > - Removed generic process function. > - Change the process function pointer at node init time to vector > function if suitable. > ---
Acked-by: Nithin Dabilpuram <ndabilpu...@marvell.com> > lib/librte_node/ip4_lookup.c | 14 +++++++++----- > lib/librte_node/ip4_lookup_neon.h | 2 +- > lib/librte_node/ip4_lookup_sse.h | 2 +- > 3 files changed, 11 insertions(+), 7 deletions(-) > > diff --git a/lib/librte_node/ip4_lookup.c b/lib/librte_node/ip4_lookup.c > index 293c77f39e..934a6d7eab 100644 > --- a/lib/librte_node/ip4_lookup.c > +++ b/lib/librte_node/ip4_lookup.c > @@ -34,10 +34,10 @@ static struct ip4_lookup_node_main ip4_lookup_nm; > #include "ip4_lookup_neon.h" > #elif defined(RTE_ARCH_X86) > #include "ip4_lookup_sse.h" > -#else > +#endif > > static uint16_t > -ip4_lookup_node_process(struct rte_graph *graph, struct rte_node *node, > +ip4_lookup_node_process_scalar(struct rte_graph *graph, struct rte_node > *node, > void **objs, uint16_t nb_objs) > { > struct rte_ipv4_hdr *ipv4_hdr; > @@ -109,8 +109,6 @@ ip4_lookup_node_process(struct rte_graph *graph, struct > rte_node *node, > return nb_objs; > } > > -#endif > - > int > rte_node_ip4_route_add(uint32_t ip, uint8_t depth, uint16_t next_hop, > enum rte_node_ip4_lookup_next next_node) > @@ -194,13 +192,19 @@ ip4_lookup_node_init(const struct rte_graph *graph, > struct rte_node *node) > init_once = 1; > } > *lpm_p = ip4_lookup_nm.lpm_tbl[graph->socket]; > + > +#if defined(__ARM_NEON) || defined(RTE_ARCH_X86) > + if (rte_get_max_simd_bitwidth() >= RTE_SIMD_128) > + node->process = ip4_lookup_node_process_vec; > +#endif > + > node_dbg("ip4_lookup", "Initialized ip4_lookup node"); > > return 0; > } > > static struct rte_node_register ip4_lookup_node = { > - .process = ip4_lookup_node_process, > + .process = ip4_lookup_node_process_scalar, > .name = "ip4_lookup", > > .init = ip4_lookup_node_init, > diff --git a/lib/librte_node/ip4_lookup_neon.h > b/lib/librte_node/ip4_lookup_neon.h > index 5e5a7d87be..0ad2763b82 100644 > --- a/lib/librte_node/ip4_lookup_neon.h > +++ b/lib/librte_node/ip4_lookup_neon.h > @@ -7,7 +7,7 @@ > > /* ARM64 NEON */ > static uint16_t > -ip4_lookup_node_process(struct rte_graph *graph, struct rte_node *node, > +ip4_lookup_node_process_vec(struct rte_graph *graph, struct rte_node *node, > void **objs, uint16_t nb_objs) > { > struct rte_mbuf *mbuf0, *mbuf1, *mbuf2, *mbuf3, **pkts; > diff --git a/lib/librte_node/ip4_lookup_sse.h > b/lib/librte_node/ip4_lookup_sse.h > index a071cc5919..264c986071 100644 > --- a/lib/librte_node/ip4_lookup_sse.h > +++ b/lib/librte_node/ip4_lookup_sse.h > @@ -7,7 +7,7 @@ > > /* X86 SSE */ > static uint16_t > -ip4_lookup_node_process(struct rte_graph *graph, struct rte_node *node, > +ip4_lookup_node_process_vec(struct rte_graph *graph, struct rte_node *node, > void **objs, uint16_t nb_objs) > { > struct rte_mbuf *mbuf0, *mbuf1, *mbuf2, *mbuf3, **pkts; > -- > 2.22.0 >