diff options
author | Damjan Marion <damarion@cisco.com> | 2018-05-17 12:44:00 +0200 |
---|---|---|
committer | Dave Barach <openvpp@barachs.net> | 2018-05-17 19:17:05 +0000 |
commit | afe56de947822bb981bd30242f4e3c2c469f9ecc (patch) | |
tree | 2d4792318b31d6ffbe62b3d5957eff45f0bcb47c /src/plugins/dpdk/device/node.c | |
parent | ed984e0b3ba8480123b0406926337b1045407f75 (diff) |
Add buffer pointer-to-index and index-to-pointer array functions
Change-Id: Ib3fcc3ceb7f315389bcdecbb7d9632540a5dd6ba
Signed-off-by: Damjan Marion <damarion@cisco.com>
Diffstat (limited to 'src/plugins/dpdk/device/node.c')
-rw-r--r-- | src/plugins/dpdk/device/node.c | 63 |
1 files changed, 3 insertions, 60 deletions
diff --git a/src/plugins/dpdk/device/node.c b/src/plugins/dpdk/device/node.c index 7ba4dad8ae9..3311ac4830d 100644 --- a/src/plugins/dpdk/device/node.c +++ b/src/plugins/dpdk/device/node.c @@ -213,65 +213,6 @@ poll_rate_limit (dpdk_main_t * dm) <code>xd->per_interface_next_index</code> */ -static_always_inline void -dpdk_mbufs_to_buffer_indices (vlib_main_t * vm, struct rte_mbuf **mb, - u32 * bi, uword n_left) -{ -#ifdef CLIB_HAVE_VEC256 - u32x8 mask = { 0, 2, 4, 6, 1, 3, 5, 7 }; - u64x4 off4 = u64x4_splat (buffer_main.buffer_mem_start - - sizeof (struct rte_mbuf)); -#endif - - while (n_left >= 8) - { -#ifdef CLIB_HAVE_VEC256 - /* load 4 pointers into 256-bit register */ - u64x4 v0 = u64x4_load_unaligned (mb); - u64x4 v1 = u64x4_load_unaligned (mb + 4); - u32x8 v2, v3; - - /* calculate 4 buffer indices in parallel - vlib_buffer_t is straight after rte_mbuf so advance all 4 - pointers for size of rte_mbuf */ - v0 -= off4; - v1 -= off4; - - v0 >>= CLIB_LOG2_CACHE_LINE_BYTES; - v1 >>= CLIB_LOG2_CACHE_LINE_BYTES; - - /* permute 256-bit register so lower u32s of each buffer index are - * placed into lower 128-bits */ - v2 = u32x8_permute ((u32x8) v0, mask); - v3 = u32x8_permute ((u32x8) v1, mask); - - /* extract lower 128-bits and save them to the array of buffer indices */ - u32x4_store_unaligned (u32x8_extract_lo (v2), bi); - u32x4_store_unaligned (u32x8_extract_lo (v3), bi + 4); -#else - /* equivalent non-nector implementation */ - bi[0] = vlib_get_buffer_index (vm, vlib_buffer_from_rte_mbuf (mb[0])); - bi[1] = vlib_get_buffer_index (vm, vlib_buffer_from_rte_mbuf (mb[1])); - bi[2] = vlib_get_buffer_index (vm, vlib_buffer_from_rte_mbuf (mb[2])); - bi[3] = vlib_get_buffer_index (vm, vlib_buffer_from_rte_mbuf (mb[3])); - bi[4] = vlib_get_buffer_index (vm, vlib_buffer_from_rte_mbuf (mb[4])); - bi[5] = vlib_get_buffer_index (vm, vlib_buffer_from_rte_mbuf (mb[5])); - bi[6] = vlib_get_buffer_index (vm, vlib_buffer_from_rte_mbuf (mb[6])); - bi[7] = vlib_get_buffer_index (vm, vlib_buffer_from_rte_mbuf (mb[7])); -#endif - bi += 8; - mb += 8; - n_left -= 8; - } - while (n_left) - { - bi[0] = vlib_get_buffer_index (vm, vlib_buffer_from_rte_mbuf (mb[0])); - bi += 1; - mb += 1; - n_left -= 1; - } -} - static_always_inline u8 dpdk_ol_flags_extract (struct rte_mbuf **mb, u8 * flags, int count) { @@ -604,7 +545,9 @@ dpdk_device_input (vlib_main_t * vm, dpdk_main_t * dm, dpdk_device_t * xd, } /* enqueue buffers to the next node */ - dpdk_mbufs_to_buffer_indices (vm, ptd->mbufs, ptd->buffers, n_rx_packets); + vlib_get_buffer_indices_with_offset (vm, (void **) ptd->mbufs, ptd->buffers, + n_rx_packets, + sizeof (struct rte_mbuf)); n_left = n_rx_packets; next = ptd->next; buffers = ptd->buffers; |