aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatias Elo <matias.elo@nokia.com>2018-07-26 10:22:05 +0300
committerMaxim Uvarov <maxim.uvarov@linaro.org>2018-07-27 11:02:50 +0300
commitef97ffce4aea71b22f1eb87bd34d15b1125c5737 (patch)
treef1b290d669b4823d57f7bc4b14ef448f021efe9d
parentf503a234fa159424a6dcacb006148f33aa54aa21 (diff)
linux-dpdk: packet: optimize odp_packet_copy_to_mem()
Sync implementation with linux-generic and use rte_memcpy. Signed-off-by: Matias Elo <matias.elo@nokia.com> Reviewed-by: Bill Fischofer <bill.fischofer@linaro.org> Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
-rw-r--r--platform/linux-dpdk/include/odp/api/plat/packet_inlines.h22
1 files changed, 19 insertions, 3 deletions
diff --git a/platform/linux-dpdk/include/odp/api/plat/packet_inlines.h b/platform/linux-dpdk/include/odp/api/plat/packet_inlines.h
index ffa391b2e..825cfb5e5 100644
--- a/platform/linux-dpdk/include/odp/api/plat/packet_inlines.h
+++ b/platform/linux-dpdk/include/odp/api/plat/packet_inlines.h
@@ -34,6 +34,8 @@ extern "C" {
#include <rte_config.h>
#include <rte_mbuf.h>
+#include <rte_memcpy.h>
+
/** @cond _ODP_HIDE_FROM_DOXYGEN_ */
#ifndef _ODP_NO_INLINE
@@ -297,8 +299,8 @@ _ODP_INLINE void odp_packet_prefetch(odp_packet_t pkt, uint32_t offset,
rte_prefetch0(addr + ofs);
}
-_ODP_INLINE int odp_packet_copy_to_mem(odp_packet_t pkt, uint32_t offset,
- uint32_t len, void *dst)
+static inline int _odp_packet_copy_to_mem_seg(odp_packet_t pkt, uint32_t offset,
+ uint32_t len, void *dst)
{
void *mapaddr;
uint32_t seglen = 0; /* GCC */
@@ -311,7 +313,7 @@ _ODP_INLINE int odp_packet_copy_to_mem(odp_packet_t pkt, uint32_t offset,
while (len > 0) {
mapaddr = odp_packet_offset(pkt, offset, &seglen, NULL);
cpylen = len > seglen ? seglen : len;
- memcpy(dstaddr, mapaddr, cpylen);
+ rte_memcpy(dstaddr, mapaddr, cpylen);
offset += cpylen;
dstaddr += cpylen;
len -= cpylen;
@@ -320,6 +322,20 @@ _ODP_INLINE int odp_packet_copy_to_mem(odp_packet_t pkt, uint32_t offset,
return 0;
}
+_ODP_INLINE int odp_packet_copy_to_mem(odp_packet_t pkt, uint32_t offset,
+ uint32_t len, void *dst)
+{
+ uint32_t seg_len = odp_packet_seg_len(pkt);
+ uint8_t *data = (uint8_t *)odp_packet_data(pkt);
+
+ if (odp_unlikely(offset + len > seg_len))
+ return _odp_packet_copy_to_mem_seg(pkt, offset, len, dst);
+
+ rte_memcpy(dst, data + offset, len);
+
+ return 0;
+}
+
_ODP_INLINE int odp_packet_copy_from_mem(odp_packet_t pkt, uint32_t offset,
uint32_t len, const void *src)
{