diff options
author | Matias Elo <matias.elo@nokia.com> | 2018-07-26 10:22:05 +0300 |
---|---|---|
committer | Maxim Uvarov <maxim.uvarov@linaro.org> | 2018-07-27 11:02:50 +0300 |
commit | ef97ffce4aea71b22f1eb87bd34d15b1125c5737 (patch) | |
tree | f1b290d669b4823d57f7bc4b14ef448f021efe9d | |
parent | f503a234fa159424a6dcacb006148f33aa54aa21 (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.h | 22 |
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) { |