@@ -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
@@ -42,8 +42,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
};
@@ -74,12 +74,16 @@ 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 *,