Create new APIs for the avx512 DPIF, enabling one baseline common code to be specialized into DPIF implementations for "outer" processing, and "recirc" processing.
Signed-off-by: Kumar Amber <kumar.am...@intel.com> Signed-off-by: Cian Ferriter <cian.ferri...@intel.com> Co-authored-by: Cian Ferriter <cian.ferri...@intel.com> --- v3: - Fix comments from Harry. --- --- lib/dpif-netdev-avx512.c | 32 +++++++++++++++++++++++++++----- lib/dpif-netdev-private-dpif.c | 4 ++-- lib/dpif-netdev-private-dpif.h | 16 ++++++++++++---- lib/dpif-netdev.c | 5 ++--- 4 files changed, 43 insertions(+), 14 deletions(-) diff --git a/lib/dpif-netdev-avx512.c b/lib/dpif-netdev-avx512.c index 11d9a0005..ecf512651 100644 --- a/lib/dpif-netdev-avx512.c +++ b/lib/dpif-netdev-avx512.c @@ -59,8 +59,13 @@ struct dpif_userdata { struct pkt_flow_meta pkt_meta[NETDEV_MAX_BURST]; }; +static int32_t +dp_netdev_input_avx512__(struct dp_netdev_pmd_thread *pmd, + struct dp_packet_batch *packets, + bool md_is_valid, odp_port_t in_port); + int32_t -dp_netdev_input_outer_avx512_probe(void) +dp_netdev_input_avx512_probe(void) { bool avx512f_available = cpu_has_isa(OVS_CPU_ISA_X86_AVX512F); bool bmi2_available = cpu_has_isa(OVS_CPU_ISA_X86_BMI2); @@ -72,10 +77,10 @@ dp_netdev_input_outer_avx512_probe(void) return 0; } -int32_t -dp_netdev_input_outer_avx512(struct dp_netdev_pmd_thread *pmd, - struct dp_packet_batch *packets, - odp_port_t in_port) +static inline int32_t ALWAYS_INLINE +dp_netdev_input_avx512__(struct dp_netdev_pmd_thread *pmd, + struct dp_packet_batch *packets, + bool md_is_valid OVS_UNUSED, odp_port_t in_port) { /* Allocate DPIF userdata. */ if (OVS_UNLIKELY(!pmd->netdev_input_func_userdata)) { @@ -380,5 +385,22 @@ dp_netdev_input_outer_avx512(struct dp_netdev_pmd_thread *pmd, return 0; } +int32_t +dp_netdev_input_avx512(struct dp_netdev_pmd_thread *pmd, + struct dp_packet_batch *packets, + odp_port_t in_port) +{ + int ret = dp_netdev_input_avx512__(pmd, packets, false, in_port); + return ret; +} + +int32_t +dp_netdev_input_avx512_recirc(struct dp_netdev_pmd_thread *pmd, + struct dp_packet_batch *packets) +{ + int ret = dp_netdev_input_avx512__(pmd, packets, true, 0); + return ret; +} + #endif #endif diff --git a/lib/dpif-netdev-private-dpif.c b/lib/dpif-netdev-private-dpif.c index 6f8de9094..2dc51270a 100644 --- a/lib/dpif-netdev-private-dpif.c +++ b/lib/dpif-netdev-private-dpif.c @@ -44,8 +44,8 @@ static struct dpif_netdev_impl_info_t dpif_impls[] = { #if (__x86_64__ && HAVE_AVX512F && HAVE_LD_AVX512_GOOD && __SSE4_2__) /* Only available on x86_64 bit builds with SSE 4.2 used for OVS core. */ - [DPIF_NETDEV_IMPL_AVX512] = { .input_func = dp_netdev_input_outer_avx512, - .probe = dp_netdev_input_outer_avx512_probe, + [DPIF_NETDEV_IMPL_AVX512] = { .input_func = dp_netdev_input_avx512, + .probe = dp_netdev_input_avx512_probe, .name = "dpif_avx512", }, #endif }; diff --git a/lib/dpif-netdev-private-dpif.h b/lib/dpif-netdev-private-dpif.h index 15f1f36b3..37908de9a 100644 --- a/lib/dpif-netdev-private-dpif.h +++ b/lib/dpif-netdev-private-dpif.h @@ -74,11 +74,19 @@ dp_netdev_input(struct dp_netdev_pmd_thread *pmd, /* AVX512 enabled DPIF implementation and probe functions. */ int32_t -dp_netdev_input_outer_avx512_probe(void); +dp_netdev_input_avx512_probe(void); int32_t -dp_netdev_input_outer_avx512(struct dp_netdev_pmd_thread *pmd, - struct dp_packet_batch *packets, - odp_port_t in_port); +dp_netdev_input_avx512(struct dp_netdev_pmd_thread *pmd, + struct dp_packet_batch *packets, + odp_port_t in_port); + +int32_t +dp_netdev_input_avx512_recirc(struct dp_netdev_pmd_thread *pmd, + struct dp_packet_batch *packets); + +int32_t +dp_netdev_recirculate(struct dp_netdev_pmd_thread *, + struct dp_packet_batch *); #endif /* netdev-private.h */ diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index c4e47f715..ea95acde0 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -545,8 +545,6 @@ static void dp_netdev_execute_actions(struct dp_netdev_pmd_thread *pmd, const struct flow *flow, const struct nlattr *actions, size_t actions_len); -static void dp_netdev_recirculate(struct dp_netdev_pmd_thread *, - struct dp_packet_batch *); static void dp_netdev_disable_upcall(struct dp_netdev *); static void dp_netdev_pmd_reload_done(struct dp_netdev_pmd_thread *pmd); @@ -8493,11 +8491,12 @@ dp_netdev_input(struct dp_netdev_pmd_thread *pmd, return 0; } -static void +int32_t dp_netdev_recirculate(struct dp_netdev_pmd_thread *pmd, struct dp_packet_batch *packets) { dp_netdev_input__(pmd, packets, true, 0); + return 0; } struct dp_netdev_execute_aux { -- 2.25.1 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev