diff mbox series

[API-NEXT,v4,5/6] linux-gen: packet: initialize user ptr to NULL

Message ID 1516698014-28886-6-git-send-email-odpbot@yandex.ru
State New
Headers show
Series [API-NEXT,v4,1/6] linux-gen: packet: single user ptr field | expand

Commit Message

Github ODP bot Jan. 23, 2018, 9 a.m. UTC
From: Petri Savolainen <petri.savolainen@linaro.org>


Use a flag to record if user pointer has been set. This
avoids resetting the pointer in every alloc.

Signed-off-by: Petri Savolainen <petri.savolainen@linaro.org>

---
/** Email created from pull request 392 (psavol:next-user-ptr-init-rebase)
 ** https://github.com/Linaro/odp/pull/392
 ** Patch: https://github.com/Linaro/odp/pull/392.patch
 ** Base sha: 4508f410a04cf1657d607d24aa2530a42ef011f7
 ** Merge commit sha: 3781732a78e4a3f0347b6b4299e9753da3929a42
 **/
 .../include/odp/api/plat/packet_inline_types.h              | 12 +++++++++---
 .../linux-generic/include/odp/api/plat/packet_inlines.h     |  7 +++++++
 platform/linux-generic/odp_packet.c                         | 13 +++++++++++--
 3 files changed, 27 insertions(+), 5 deletions(-)
diff mbox series

Patch

diff --git a/platform/linux-generic/include/odp/api/plat/packet_inline_types.h b/platform/linux-generic/include/odp/api/plat/packet_inline_types.h
index dbfc66411..e8ebdabb1 100644
--- a/platform/linux-generic/include/odp/api/plat/packet_inline_types.h
+++ b/platform/linux-generic/include/odp/api/plat/packet_inline_types.h
@@ -44,6 +44,7 @@  typedef struct _odp_packet_inline_offset_t {
 	uint16_t flow_hash;
 	uint16_t timestamp;
 	uint16_t input_flags;
+	uint16_t flags;
 
 } _odp_packet_inline_offset_t;
 
@@ -109,7 +110,12 @@  typedef union {
 	uint32_t all_flags;
 
 	struct {
-		uint32_t reserved1:     12;
+		uint32_t reserved1:     11;
+
+	/*
+	 * Init flags
+	 */
+		uint32_t user_ptr_set:   1; /* User has set a non-NULL value */
 
 	/*
 	 * Packet output flags
@@ -135,8 +141,8 @@  typedef union {
 
 	/* Flag groups */
 	struct {
-		uint32_t reserved2:     12;
-		uint32_t other:         12; /* All other flags */
+		uint32_t reserved2:     11;
+		uint32_t other:         13; /* All other flags */
 		uint32_t error:          8; /* All error flags */
 	} all;
 
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 3416b9949..fe22d70a8 100644
--- a/platform/linux-generic/include/odp/api/plat/packet_inlines.h
+++ b/platform/linux-generic/include/odp/api/plat/packet_inlines.h
@@ -102,6 +102,13 @@  static inline int _odp_packet_num_segs(odp_packet_t pkt)
 /** @internal Inline function @param pkt @return */
 static inline void *_odp_packet_user_ptr(odp_packet_t pkt)
 {
+	_odp_packet_flags_t flags;
+
+	flags.all_flags = _odp_pkt_get(pkt, uint32_t, flags);
+
+	if (flags.user_ptr_set == 0)
+		return NULL;
+
 	return _odp_pkt_get(pkt, void *, user_ptr);
 }
 
diff --git a/platform/linux-generic/odp_packet.c b/platform/linux-generic/odp_packet.c
index c8ba69e25..dc16e9be4 100644
--- a/platform/linux-generic/odp_packet.c
+++ b/platform/linux-generic/odp_packet.c
@@ -43,7 +43,8 @@  const _odp_packet_inline_offset_t ODP_ALIGNED_CACHE _odp_packet_inline = {
 	.l4_offset      = offsetof(odp_packet_hdr_t, p.l4_offset),
 	.flow_hash      = offsetof(odp_packet_hdr_t, flow_hash),
 	.timestamp      = offsetof(odp_packet_hdr_t, timestamp),
-	.input_flags    = offsetof(odp_packet_hdr_t, p.input_flags)
+	.input_flags    = offsetof(odp_packet_hdr_t, p.input_flags),
+	.flags          = offsetof(odp_packet_hdr_t, p.flags)
 
 };
 
@@ -1260,7 +1261,15 @@  int odp_packet_input_index(odp_packet_t pkt)
 
 void odp_packet_user_ptr_set(odp_packet_t pkt, const void *ptr)
 {
-	packet_hdr(pkt)->buf_hdr.user_ptr = ptr;
+	odp_packet_hdr_t *pkt_hdr = packet_hdr(pkt);
+
+	if (odp_unlikely(ptr == NULL)) {
+		pkt_hdr->p.flags.user_ptr_set = 0;
+		return;
+	}
+
+	pkt_hdr->buf_hdr.user_ptr     = ptr;
+	pkt_hdr->p.flags.user_ptr_set = 1;
 }
 
 int odp_packet_l2_offset_set(odp_packet_t pkt, uint32_t offset)