Previously packet pool segment size was always selected based on the internal configuration defines. After this patch packet pool segment size is selected during pool_create() which enables creating multiple packet pools with different segment sizes.
Signed-off-by: Matias Elo <[email protected]> --- .../linux-generic/include/odp_config_internal.h | 2 +- platform/linux-generic/odp_pool.c | 23 +++++++++++++++++++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/platform/linux-generic/include/odp_config_internal.h b/platform/linux-generic/include/odp_config_internal.h index e7d84c9..45afba3 100644 --- a/platform/linux-generic/include/odp_config_internal.h +++ b/platform/linux-generic/include/odp_config_internal.h @@ -98,7 +98,7 @@ extern "C" { * defined segment length (seg_len in odp_pool_param_t) will be rounded up into * this value. */ -#define CONFIG_PACKET_SEG_LEN_MIN CONFIG_PACKET_MAX_SEG_LEN +#define CONFIG_PACKET_SEG_LEN_MIN 256 /* Maximum number of shared memory blocks. * diff --git a/platform/linux-generic/odp_pool.c b/platform/linux-generic/odp_pool.c index 317f113..7a6bad5 100644 --- a/platform/linux-generic/odp_pool.c +++ b/platform/linux-generic/odp_pool.c @@ -329,12 +329,29 @@ static odp_pool_t pool_create(const char *name, odp_pool_param_t *params, break; case ODP_POOL_PACKET: + seg_len = CONFIG_PACKET_MAX_SEG_LEN; + max_len = CONFIG_PACKET_MAX_SEGS * seg_len; + + if (params->pkt.len) + seg_len = params->pkt.len; + if (params->pkt.seg_len && + params->pkt.seg_len > seg_len) + seg_len = params->pkt.seg_len; + if (seg_len < CONFIG_PACKET_SEG_LEN_MIN) + seg_len = CONFIG_PACKET_SEG_LEN_MIN; + + /* Make sure max length packet fits */ + if (params->pkt.max_len != 0) + max_len = params->pkt.max_len; + if ((max_len + seg_len - 1) / seg_len > + CONFIG_PACKET_MAX_SEGS) + seg_len = (max_len + CONFIG_PACKET_MAX_SEGS - 1) / + CONFIG_PACKET_MAX_SEGS; + headroom = CONFIG_PACKET_HEADROOM; tailroom = CONFIG_PACKET_TAILROOM; num = params->pkt.num; uarea_size = params->pkt.uarea_size; - seg_len = CONFIG_PACKET_MAX_SEG_LEN; - max_len = CONFIG_PACKET_MAX_SEGS * seg_len; break; case ODP_POOL_TIMEOUT: @@ -819,7 +836,7 @@ int odp_pool_capability(odp_pool_capability_t *capa) capa->pkt.min_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; + capa->pkt.min_seg_len = CONFIG_PACKET_SEG_LEN_MIN; capa->pkt.max_seg_len = max_seg_len; capa->pkt.max_uarea_size = MAX_SIZE; -- 2.7.4
