summaryrefslogtreecommitdiffstats
path: root/src/plugins/dpdk/device/node.c
diff options
context:
space:
mode:
authorDamjan Marion <damarion@cisco.com>2018-05-17 12:44:00 +0200
committerDave Barach <openvpp@barachs.net>2018-05-17 19:17:05 +0000
commitafe56de947822bb981bd30242f4e3c2c469f9ecc (patch)
tree2d4792318b31d6ffbe62b3d5957eff45f0bcb47c /src/plugins/dpdk/device/node.c
parented984e0b3ba8480123b0406926337b1045407f75 (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.c63
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;