From: Petri Savolainen <petri.savolai...@linaro.org>

Inline commonly used packet to/from memory copy functions.

Signed-off-by: Petri Savolainen <petri.savolai...@linaro.org>
---
/** Email created from pull request 437 (psavol:master-packet-optim)
 ** https://github.com/Linaro/odp/pull/437
 ** Patch: https://github.com/Linaro/odp/pull/437.patch
 ** Base sha: b95ccd3db6eeb7358a877541747e06354429acdd
 ** Merge commit sha: 3c2134ecc18e4fd52cd526b5c067815ca73864cc
 **/
 .../include/odp/api/plat/packet_inlines.h          | 36 ++++++++
 .../include/odp/api/plat/packet_inlines_api.h      | 12 +++
 platform/linux-generic/odp_packet.c                | 96 +++++++++++-----------
 3 files changed, 96 insertions(+), 48 deletions(-)

diff --git a/platform/linux-generic/include/odp/api/plat/packet_inlines.h 
b/platform/linux-generic/include/odp/api/plat/packet_inlines.h
index 765bafb4f..90e205fd4 100644
--- a/platform/linux-generic/include/odp/api/plat/packet_inlines.h
+++ b/platform/linux-generic/include/odp/api/plat/packet_inlines.h
@@ -23,11 +23,19 @@
 #include <odp/api/plat/packet_inline_types.h>
 #include <odp/api/plat/pool_inline_types.h>
 
+#include <string.h>
+
 /** @cond _ODP_HIDE_FROM_DOXYGEN_ */
 
 void *_odp_packet_map(void *pkt_ptr, uint32_t offset, uint32_t *seg_len,
                      int *seg_idx);
 
+int _odp_packet_copy_from_mem_seg(odp_packet_t pkt, uint32_t offset,
+                                 uint32_t len, const void *src);
+
+int _odp_packet_copy_to_mem_seg(odp_packet_t pkt, uint32_t offset,
+                               uint32_t len, void *dst);
+
 extern const _odp_packet_inline_offset_t _odp_packet_inline;
 extern const _odp_pool_inline_offset_t   _odp_pool_inline;
 
@@ -225,6 +233,34 @@ static inline odp_buffer_t packet_to_buffer(odp_packet_t 
pkt)
        return (odp_buffer_t)pkt;
 }
 
+static inline int _odp_packet_copy_from_mem(odp_packet_t pkt, uint32_t offset,
+                                           uint32_t len, const void *src)
+{
+       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_from_mem_seg(pkt, offset, len, src);
+
+       memcpy(data + offset, src, len);
+
+       return 0;
+}
+
+static 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);
+
+       memcpy(dst, data + offset, len);
+
+       return 0;
+}
+
 /** @endcond */
 
 #endif
diff --git a/platform/linux-generic/include/odp/api/plat/packet_inlines_api.h 
b/platform/linux-generic/include/odp/api/plat/packet_inlines_api.h
index c90a69c52..9b31c923f 100644
--- a/platform/linux-generic/include/odp/api/plat/packet_inlines_api.h
+++ b/platform/linux-generic/include/odp/api/plat/packet_inlines_api.h
@@ -140,4 +140,16 @@ _ODP_INLINE void odp_packet_prefetch(odp_packet_t pkt, 
uint32_t offset,
        return _odp_packet_prefetch(pkt, offset, len);
 }
 
+_ODP_INLINE int odp_packet_copy_from_mem(odp_packet_t pkt, uint32_t offset,
+                                        uint32_t len, const void *src)
+{
+       return _odp_packet_copy_from_mem(pkt, offset, len, src);
+}
+
+_ODP_INLINE int odp_packet_copy_to_mem(odp_packet_t pkt, uint32_t offset,
+                                      uint32_t len, void *dst)
+{
+       return _odp_packet_copy_to_mem(pkt, offset, len, dst);
+}
+
 #endif
diff --git a/platform/linux-generic/odp_packet.c 
b/platform/linux-generic/odp_packet.c
index 8d6185987..2867e67e9 100644
--- a/platform/linux-generic/odp_packet.c
+++ b/platform/linux-generic/odp_packet.c
@@ -334,6 +334,54 @@ void *_odp_packet_map(void *pkt_ptr, uint32_t offset, 
uint32_t *seg_len,
        return packet_map(pkt_ptr, offset, seg_len, seg_idx);
 }
 
+int _odp_packet_copy_from_mem_seg(odp_packet_t pkt, uint32_t offset,
+                                 uint32_t len, const void *src)
+{
+       void *mapaddr;
+       uint32_t seglen = 0; /* GCC */
+       uint32_t cpylen;
+       const uint8_t *srcaddr = (const uint8_t *)src;
+       odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
+
+       if (offset + len > pkt_hdr->frame_len)
+               return -1;
+
+       while (len > 0) {
+               mapaddr = packet_map(pkt_hdr, offset, &seglen, NULL);
+               cpylen = len > seglen ? seglen : len;
+               memcpy(mapaddr, srcaddr, cpylen);
+               offset  += cpylen;
+               srcaddr += cpylen;
+               len     -= cpylen;
+       }
+
+       return 0;
+}
+
+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 */
+       uint32_t cpylen;
+       uint8_t *dstaddr = (uint8_t *)dst;
+       odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
+
+       if (offset + len > pkt_hdr->frame_len)
+               return -1;
+
+       while (len > 0) {
+               mapaddr = packet_map(pkt_hdr, offset, &seglen, NULL);
+               cpylen = len > seglen ? seglen : len;
+               memcpy(dstaddr, mapaddr, cpylen);
+               offset  += cpylen;
+               dstaddr += cpylen;
+               len     -= cpylen;
+       }
+
+       return 0;
+}
+
 #include <odp/visibility_end.h>
 
 void packet_parse_reset(odp_packet_hdr_t *pkt_hdr)
@@ -1595,54 +1643,6 @@ odp_packet_t odp_packet_copy_part(odp_packet_t pkt, 
uint32_t offset,
        return newpkt;
 }
 
-int odp_packet_copy_to_mem(odp_packet_t pkt, uint32_t offset,
-                          uint32_t len, void *dst)
-{
-       void *mapaddr;
-       uint32_t seglen = 0; /* GCC */
-       uint32_t cpylen;
-       uint8_t *dstaddr = (uint8_t *)dst;
-       odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
-
-       if (offset + len > pkt_hdr->frame_len)
-               return -1;
-
-       while (len > 0) {
-               mapaddr = packet_map(pkt_hdr, offset, &seglen, NULL);
-               cpylen = len > seglen ? seglen : len;
-               memcpy(dstaddr, mapaddr, cpylen);
-               offset  += cpylen;
-               dstaddr += cpylen;
-               len     -= cpylen;
-       }
-
-       return 0;
-}
-
-int odp_packet_copy_from_mem(odp_packet_t pkt, uint32_t offset,
-                            uint32_t len, const void *src)
-{
-       void *mapaddr;
-       uint32_t seglen = 0; /* GCC */
-       uint32_t cpylen;
-       const uint8_t *srcaddr = (const uint8_t *)src;
-       odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
-
-       if (offset + len > pkt_hdr->frame_len)
-               return -1;
-
-       while (len > 0) {
-               mapaddr = packet_map(pkt_hdr, offset, &seglen, NULL);
-               cpylen = len > seglen ? seglen : len;
-               memcpy(mapaddr, srcaddr, cpylen);
-               offset  += cpylen;
-               srcaddr += cpylen;
-               len     -= cpylen;
-       }
-
-       return 0;
-}
-
 int odp_packet_copy_from_pkt(odp_packet_t dst, uint32_t dst_offset,
                             odp_packet_t src, uint32_t src_offset,
                             uint32_t len)

Reply via email to