diff options
Diffstat (limited to 'src/plugins/rdma/input.c')
-rw-r--r-- | src/plugins/rdma/input.c | 55 |
1 files changed, 35 insertions, 20 deletions
diff --git a/src/plugins/rdma/input.c b/src/plugins/rdma/input.c index 5f2c0bbf31f..827fc577484 100644 --- a/src/plugins/rdma/input.c +++ b/src/plugins/rdma/input.c @@ -681,51 +681,66 @@ rdma_device_mlx5dv_l3_validate_and_swap_bc (rdma_per_thread_data_t /* verify that all ip4 packets have l3_ok flag set and convert packet length from network to host byte order */ int skip_ip4_cksum = 1; - int n_left = 0; + int n_left = n_rx_packets; + u16 *cqe_flags = ptd->cqe_flags; #if defined CLIB_HAVE_VEC256 - if (n_rx_packets >= 16) + if (n_left >= 16) { u16x16 mask16 = u16x16_splat (mask); u16x16 match16 = u16x16_splat (match); u16x16 r16 = {}; - n_left = n_rx_packets % 16; + while (n_left >= 16) + { + r16 |= (*(u16x16 *) cqe_flags & mask16) != match16; + + *(u32x8 *) bc = u32x8_byte_swap (*(u32x8 *) bc); + *(u32x8 *) (bc + 8) = u32x8_byte_swap (*(u32x8 *) (bc + 8)); - for (int i = 0; i < n_rx_packets / 16; i++) - r16 |= (ptd->cqe_flags16[i] & mask16) != match16; + cqe_flags += 16; + bc += 16; + n_left -= 16; + } if (!u16x16_is_all_zero (r16)) skip_ip4_cksum = 0; - - for (int i = 0; i < (n_rx_packets - n_left); i += 8) - *(u32x8 *) (bc + i) = u32x8_byte_swap (*(u32x8 *) (bc + i)); } #elif defined CLIB_HAVE_VEC128 - if (n_rx_packets >= 8) + if (n_left >= 8) { u16x8 mask8 = u16x8_splat (mask); u16x8 match8 = u16x8_splat (match); u16x8 r8 = {}; - n_left = n_rx_packets % 8; + while (n_left >= 8) + { + r8 |= (*(u16x8 *) cqe_flags & mask8) != match8; + + *(u32x4 *) bc = u32x4_byte_swap (*(u32x4 *) bc); + *(u32x4 *) (bc + 4) = u32x4_byte_swap (*(u32x4 *) (bc + 4)); - for (int i = 0; i < n_rx_packets / 8; i++) - r8 |= (ptd->cqe_flags8[i] & mask8) != match8; + cqe_flags += 8; + bc += 8; + n_left -= 8; + } if (!u16x8_is_all_zero (r8)) skip_ip4_cksum = 0; - - for (int i = 0; i < (n_rx_packets - n_left); i += 4) - *(u32x4 *) (bc + i) = u32x4_byte_swap (*(u32x4 *) (bc + i)); } #endif - for (int i = (n_rx_packets - n_left); i < n_rx_packets; i++) - if ((ptd->cqe_flags[i] & mask) != match) - skip_ip4_cksum = 0; - for (int i = (n_rx_packets - n_left); i < n_rx_packets; i++) - bc[i] = clib_net_to_host_u32 (bc[i]); + while (n_left >= 1) + { + if ((cqe_flags[0] & mask) != match) + skip_ip4_cksum = 0; + + bc[0] = clib_net_to_host_u32 (bc[0]); + + cqe_flags += 1; + bc += 1; + n_left -= 1; + } return skip_ip4_cksum; } |