diff options
Diffstat (limited to 'platform/linux-generic/pool/generic.c')
-rw-r--r-- | platform/linux-generic/pool/generic.c | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/platform/linux-generic/pool/generic.c b/platform/linux-generic/pool/generic.c index c628eb1ba..520d8a6f4 100644 --- a/platform/linux-generic/pool/generic.c +++ b/platform/linux-generic/pool/generic.c @@ -4,10 +4,13 @@ * SPDX-License-Identifier: BSD-3-Clause */ +#include "config.h" + #include <odp/api/pool.h> #include <odp/api/shared_memory.h> #include <odp/api/align.h> #include <odp/api/ticketlock.h> +#include <odp/api/system_info.h> #include <odp_pool_internal.h> #include <odp_internal.h> @@ -37,6 +40,9 @@ ODP_STATIC_ASSERT(CONFIG_POOL_CACHE_SIZE > (2 * CACHE_BURST), ODP_STATIC_ASSERT(CONFIG_PACKET_SEG_LEN_MIN >= 256, "ODP Segment size must be a minimum of 256 bytes"); +ODP_STATIC_ASSERT(CONFIG_PACKET_SEG_SIZE < 0xffff, + "Segment size must be less than 64k (16 bit offsets)"); + pool_table_t *pool_tbl; __thread pool_local_t local; @@ -233,12 +239,17 @@ static void init_buffers(pool_t *pool) /* Show user requested size through API */ buf_hdr->uarea_size = pool->params.pkt.uarea_size; buf_hdr->segcount = 1; + buf_hdr->num_seg = 1; + buf_hdr->next_seg = NULL; + buf_hdr->last_seg = buf_hdr; /* Pointer to data start (of the first segment) */ buf_hdr->seg[0].hdr = buf_hdr; buf_hdr->seg[0].data = &data[offset]; buf_hdr->seg[0].len = pool->data_size; + odp_atomic_init_u32(&buf_hdr->ref_cnt, 0); + /* Store base values for fast init */ buf_hdr->base_data = buf_hdr->seg[0].data; buf_hdr->buf_end = &data[offset + pool->data_size + @@ -249,6 +260,22 @@ static void init_buffers(pool_t *pool) } } +static bool shm_is_from_huge_pages(odp_shm_t shm) +{ + odp_shm_info_t info; + uint64_t huge_page_size = odp_sys_huge_page_size(); + + if (huge_page_size == 0) + return 0; + + if (odp_shm_info(shm, &info)) { + ODP_ERR("Failed to fetch shm info\n"); + return 0; + } + + return (info.page_size >= huge_page_size); +} + static odp_pool_t pool_create(const char *name, odp_pool_param_t *params, uint32_t shmflags) { @@ -296,6 +323,10 @@ static odp_pool_t pool_create(const char *name, odp_pool_param_t *params, break; case ODP_POOL_PACKET: + if (params->pkt.headroom > CONFIG_PACKET_HEADROOM) { + ODP_ERR("Packet headroom size not supported."); + return ODP_POOL_INVALID; + } headroom = CONFIG_PACKET_HEADROOM; tailroom = CONFIG_PACKET_TAILROOM; num = params->pkt.num; @@ -374,6 +405,8 @@ static odp_pool_t pool_create(const char *name, odp_pool_param_t *params, goto error; } + pool->mem_from_huge_pages = shm_is_from_huge_pages(pool->shm); + pool->base_addr = odp_shm_addr(pool->shm); pool->uarea_shm = ODP_SHM_INVALID; @@ -484,10 +517,8 @@ static odp_pool_t generic_pool_create(const char *name, if (check_params(params)) return ODP_POOL_INVALID; -#ifdef _ODP_PKTIO_IPC if (params && (params->type == ODP_POOL_PACKET)) shm_flags = ODP_SHM_PROC; -#endif return pool_create(name, params, shm_flags); } @@ -584,6 +615,7 @@ static int generic_pool_capability(odp_pool_capability_t *capa) capa->pkt.max_len = CONFIG_PACKET_MAX_SEGS * max_seg_len; capa->pkt.max_num = CONFIG_POOL_MAX_NUM; capa->pkt.min_headroom = CONFIG_PACKET_HEADROOM; + capa->pkt.max_headroom = CONFIG_PACKET_HEADROOM; capa->pkt.min_tailroom = CONFIG_PACKET_TAILROOM; capa->pkt.max_segs_per_pkt = CONFIG_PACKET_MAX_SEGS; capa->pkt.min_seg_len = max_seg_len; @@ -636,6 +668,7 @@ static void generic_pool_print(odp_pool_t pool_hdl) static void generic_pool_param_init(odp_pool_param_t *params) { memset(params, 0, sizeof(odp_pool_param_t)); + params->pkt.headroom = CONFIG_PACKET_HEADROOM; } static uint64_t generic_pool_to_u64(odp_pool_t hdl) |