diff mbox

[4/4] linux-generic: pools: cleanup to reflect new pool parameters

Message ID 1423859721-9719-1-git-send-email-bill.fischofer@linaro.org
State New
Headers show

Commit Message

Bill Fischofer Feb. 13, 2015, 8:35 p.m. UTC
Signed-off-by: Bill Fischofer <bill.fischofer@linaro.org>
---
 platform/linux-generic/include/odp_pool_internal.h |  1 +
 platform/linux-generic/odp_pool.c                  | 66 +++++++++++-----------
 2 files changed, 34 insertions(+), 33 deletions(-)
diff mbox

Patch

diff --git a/platform/linux-generic/include/odp_pool_internal.h b/platform/linux-generic/include/odp_pool_internal.h
index c5354e5..0c0c0be 100644
--- a/platform/linux-generic/include/odp_pool_internal.h
+++ b/platform/linux-generic/include/odp_pool_internal.h
@@ -119,6 +119,7 @@  struct pool_entry_s {
 	odp_atomic_u64_t        blkempty;
 	odp_atomic_u64_t        high_wm_count;
 	odp_atomic_u64_t        low_wm_count;
+	uint32_t                buf_num;
 	uint32_t                seg_size;
 	uint32_t                high_wm;
 	uint32_t                low_wm;
diff --git a/platform/linux-generic/odp_pool.c b/platform/linux-generic/odp_pool.c
index c07392f..1fe0c5f 100644
--- a/platform/linux-generic/odp_pool.c
+++ b/platform/linux-generic/odp_pool.c
@@ -136,13 +136,9 @@  odp_pool_t odp_pool_create(const char *name,
 		ODP_CACHE_LINE_SIZE_ROUNDUP(init_params->udata_size) :
 		0;
 
-	uint32_t blk_size, buf_stride;
-	uint32_t buf_align;
-
-	if (params->type == ODP_POOL_PACKET)
-		buf_align = 0;
-	else
-		buf_align = params->buf.align;
+	uint32_t blk_size, buf_stride, buf_num;
+	uint32_t buf_align =
+		params->type == ODP_POOL_BUFFER ? params->buf.align : 0;
 
 	/* Validate requested buffer alignment */
 	if (buf_align > ODP_CONFIG_BUFFER_ALIGN_MAX ||
@@ -158,35 +154,41 @@  odp_pool_t odp_pool_create(const char *name,
 	/* Calculate space needed for buffer blocks and metadata */
 	switch (params->type) {
 	case ODP_POOL_BUFFER:
-	case ODP_POOL_TIMEOUT:
+		buf_num  = params->buf.num;
 		blk_size = params->buf.size;
 
 		/* Optimize small raw buffers */
 		if (blk_size > ODP_MAX_INLINE_BUF || params->buf.align != 0)
 			blk_size = ODP_ALIGN_ROUNDUP(blk_size, buf_align);
 
-		buf_stride = params->type == ODP_POOL_BUFFER ?
-			sizeof(odp_buffer_hdr_stride) :
-			sizeof(odp_timeout_hdr_stride);
+		buf_stride = sizeof(odp_buffer_hdr_stride);
 		break;
 
 	case ODP_POOL_PACKET:
 		headroom = ODP_CONFIG_PACKET_HEADROOM;
 		tailroom = ODP_CONFIG_PACKET_TAILROOM;
-		unseg = params->pkt.seg_len > ODP_CONFIG_PACKET_BUF_LEN_MAX;
+		buf_num = params->pkt.num;
+		uint32_t seg_len = params->pkt.seg_len == 0 ?
+			ODP_CONFIG_PACKET_SEG_LEN_MIN :
+			headroom + params->pkt.seg_len + tailroom;
+		uint32_t pkt_len = params->pkt.len <= seg_len ?
+			seg_len : params->pkt.len;
+		unseg = pkt_len > ODP_CONFIG_PACKET_BUF_LEN_MAX;
 
 		if (unseg)
-			blk_size = ODP_ALIGN_ROUNDUP(
-				headroom + params->pkt.seg_len + tailroom,
-				buf_align);
+			blk_size = ODP_ALIGN_ROUNDUP(seg_len,
+				ODP_CONFIG_BUFFER_ALIGN_MIN);
 		else
-			blk_size = ODP_ALIGN_ROUNDUP(
-				headroom + params->pkt.seg_len + tailroom,
+			blk_size = ODP_ALIGN_ROUNDUP(pkt_len,
 				ODP_CONFIG_PACKET_SEG_LEN_MIN);
 
-		buf_stride = params->type == ODP_POOL_PACKET ?
-			sizeof(odp_packet_hdr_stride) :
-			sizeof(odp_any_hdr_stride);
+		buf_stride = sizeof(odp_packet_hdr_stride);
+		break;
+
+	case ODP_POOL_TIMEOUT:
+		blk_size = 0;
+		buf_num = params->tmo.num;
+		buf_stride = sizeof(odp_timeout_hdr_stride);
 		break;
 
 	default:
@@ -194,7 +196,7 @@  odp_pool_t odp_pool_create(const char *name,
 	}
 
 	/* Validate requested number of buffers against addressable limits */
-	if (params->buf.num >
+	if (buf_num >
 	    (ODP_BUFFER_MAX_BUFFERS / (buf_stride / ODP_CACHE_LINE_SIZE)))
 		return ODP_POOL_INVALID;
 
@@ -231,14 +233,15 @@  odp_pool_t odp_pool_create(const char *name,
 			block_size = 0;
 			pool->s.buf_align = blk_size == 0 ? 0 : sizeof(void *);
 		} else {
-			block_size = params->buf.num * blk_size;
+			block_size = buf_num * blk_size;
 			pool->s.buf_align = buf_align;
 		}
 
 		pad_size = ODP_CACHE_LINE_SIZE_ROUNDUP(block_size) - block_size;
-		mdata_size = params->buf.num * buf_stride;
-		udata_size = params->buf.num * udata_stride;
+		mdata_size = buf_num * buf_stride;
+		udata_size = buf_num * udata_stride;
 
+		pool->s.buf_num   = buf_num;
 		pool->s.pool_size = ODP_PAGE_SIZE_ROUNDUP(block_size +
 							  pad_size +
 							  mdata_size +
@@ -375,8 +378,8 @@  odp_pool_t odp_pool_create(const char *name,
 		pool->s.tailroom = tailroom;
 
 		/* Watermarks are hard-coded for now to control caching */
-		pool->s.high_wm = params->buf.num / 2;
-		pool->s.low_wm = params->buf.num / 4;
+		pool->s.high_wm = buf_num / 2;
+		pool->s.low_wm  = buf_num / 4;
 
 		pool_hdl = pool->s.pool_hdl;
 		break;
@@ -417,10 +420,7 @@  int odp_pool_info(odp_pool_t pool_hdl, odp_pool_info_t *info)
 	info->name = pool->s.name;
 	info->shm  = pool->s.flags.user_supplied_shm ?
 		pool->s.pool_shm : ODP_SHM_INVALID;
-	info->params.buf.size  = pool->s.params.buf.size;
-	info->params.buf.align = pool->s.params.buf.align;
-	info->params.buf.num   = pool->s.params.buf.num;
-	info->params.type      = pool->s.params.type;
+	info->params = pool->s.params;
 
 	return 0;
 }
@@ -446,7 +446,7 @@  int odp_pool_destroy(odp_pool_t pool_hdl)
 	flush_cache(&local_cache[pool_id], &pool->s);
 
 	/* Call fails if pool has allocated buffers */
-	if (odp_atomic_load_u32(&pool->s.bufcount) < pool->s.params.buf.num) {
+	if (odp_atomic_load_u32(&pool->s.bufcount) < pool->s.buf_num) {
 		POOL_UNLOCK(&pool->s.lock);
 		return -1;
 	}
@@ -591,10 +591,10 @@  void odp_pool_print(odp_pool_t pool_hdl)
 	ODP_DBG(" tailroom        %u\n",  pool->s.tailroom);
 	ODP_DBG(" buf align       %u requested, %u used\n",
 		pool->s.params.buf.align, pool->s.buf_align);
-	ODP_DBG(" num bufs        %u\n",  pool->s.params.buf.num);
+	ODP_DBG(" num bufs        %u\n",  pool->s.buf_num);
 	ODP_DBG(" bufs available  %u %s\n", bufcount,
 		pool->s.low_wm_assert ? " **low wm asserted**" : "");
-	ODP_DBG(" bufs in use     %u\n",  pool->s.params.buf.num - bufcount);
+	ODP_DBG(" bufs in use     %u\n",  pool->s.buf_num - bufcount);
 	ODP_DBG(" buf allocs      %lu\n", bufallocs);
 	ODP_DBG(" buf frees       %lu\n", buffrees);
 	ODP_DBG(" buf empty       %lu\n", bufempty);