Signed-off-by: Bill Fischofer <bill.fischo...@linaro.org>
---
 platform/linux-generic/include/odp_packet_internal.h | 19 +++++++++++++++++++
 platform/linux-generic/odp_packet.c                  | 10 ++++++++++
 2 files changed, 29 insertions(+)

diff --git a/platform/linux-generic/include/odp_packet_internal.h 
b/platform/linux-generic/include/odp_packet_internal.h
index 31d46df..39deae2 100644
--- a/platform/linux-generic/include/odp_packet_internal.h
+++ b/platform/linux-generic/include/odp_packet_internal.h
@@ -196,6 +196,25 @@ static inline uint32_t packet_len(odp_packet_hdr_t 
*pkt_hdr)
        return pkt_hdr->frame_len;
 }
 
+static inline uint32_t packet_ref_count(odp_packet_hdr_t *pkt_hdr)
+{
+       /* Breach the atomic type to do a peek at the ref count. This
+        * is used to bypass atomic operations if ref_count == 1 for
+        * performance reasons.
+        */
+       return pkt_hdr->ref_count.v;
+}
+
+static inline void packet_ref_count_set(odp_packet_hdr_t *pkt_hdr, uint32_t n)
+{
+       /* Only used during init when there are no other possible
+        * references to this pkt, so avoid the "atomic" overhead by
+        * a controlled breach of the atomic type here. This saves
+        * over 10% of the pathlength in routines like packet_alloc().
+        */
+       pkt_hdr->ref_count.v = n;
+}
+
 static inline void packet_set_len(odp_packet_hdr_t *pkt_hdr, uint32_t len)
 {
        pkt_hdr->frame_len = len;
diff --git a/platform/linux-generic/odp_packet.c 
b/platform/linux-generic/odp_packet.c
index 067d0fc..4bbb619 100644
--- a/platform/linux-generic/odp_packet.c
+++ b/platform/linux-generic/odp_packet.c
@@ -57,6 +57,16 @@ static inline odp_buffer_t buffer_handle(odp_packet_hdr_t 
*pkt_hdr)
        return pkt_hdr->buf_hdr.handle.handle;
 }
 
+static inline uint32_t packet_ref_inc(odp_packet_hdr_t *pkt_hdr)
+{
+       return odp_atomic_fetch_inc_u32(&pkt_hdr->ref_count);
+}
+
+static inline uint32_t packet_ref_dec(odp_packet_hdr_t *pkt_hdr)
+{
+       return odp_atomic_fetch_dec_u32(&pkt_hdr->ref_count);
+}
+
 static inline odp_packet_hdr_t *buf_to_packet_hdr(odp_buffer_t buf)
 {
        return (odp_packet_hdr_t *)buf_hdl_to_hdr(buf);
-- 
2.5.0

Reply via email to