[dpdk-dev] [PATCH v6 7/8] mempool: introduce block size align flag

Olivier MATZ olivier.matz at 6wind.com
Mon Sep 25 13:32:58 CEST 2017


On Thu, Sep 07, 2017 at 09:00:41PM +0530, Santosh Shukla wrote:
> Some mempool hw like octeontx/fpa block, demands block size
> (/total_elem_sz) aligned object start address.
> 
> Introducing an MEMPOOL_F_CAPA_BLK_ALIGNED_OBJECTS flag.
> If this flag is set:
> - Align object start address(vaddr) to a multiple of total_elt_sz.
> - Allocate one additional object. Additional object is needed to make
>   sure that requested 'n' object gets correctly populated.
> 
> Example:
> - Let's say that we get 'x' size of memory chunk from memzone.
> - And application has requested 'n' object from mempool.
> - Ideally, we start using objects at start address 0 to...(x-block_sz)
>   for n obj.
> - Not necessarily first object address i.e. 0 is aligned to block_sz.
> - So we derive 'offset' value for block_sz alignment purpose i.e..'off'.
> - That 'off' makes sure that start address of object is blk_sz aligned.
> - Calculating 'off' may end up sacrificing first block_sz area of
>   memzone area x. So total number of the object which can fit in the
>   pool area is n-1, Which is incorrect behavior.
> 
> Therefore we request one additional object (/block_sz area) from memzone
> when MEMPOOL_F_CAPA_BLK_ALIGNED_OBJECTS flag is set.
> 
> Signed-off-by: Santosh Shukla <santosh.shukla at caviumnetworks.com>
> Signed-off-by: Jerin Jacob <jerin.jacob at caviumnetworks.com>
>
> [...]
>
> --- a/lib/librte_mempool/rte_mempool.c
> +++ b/lib/librte_mempool/rte_mempool.c
> @@ -239,10 +239,15 @@ rte_mempool_calc_obj_size(uint32_t elt_size, uint32_t flags,
>   */
>  size_t
>  rte_mempool_xmem_size(uint32_t elt_num, size_t total_elt_sz, uint32_t pg_shift,
> -		      __rte_unused unsigned int flags)
> +		      unsigned int flags)
>  {
>  	size_t obj_per_page, pg_num, pg_sz;
>  
> +	if (flags & (MEMPOOL_F_CAPA_BLK_ALIGNED_OBJECTS |
> +			MEMPOOL_F_CAPA_PHYS_CONTIG))
> +		/* alignment need one additional object */
> +		elt_num += 1;
> +

In previous version, we agreed to test both _BLK_ALIGNED_OBJECTS
and _PHYS_CONTIG in _xmem_size()/_usage(). Here, the test will
also be true if only MEMPOOL_F_CAPA_PHYS_CONTIG is set.

If we want to test both, the test should be:

    mask = MEMPOOL_F_CAPA_BLK_ALIGNED_OBJECTS | MEMPOOL_F_CAPA_PHYS_CONTIG;
    if ((flags & mask) == mask)

> @@ -265,13 +270,18 @@ rte_mempool_xmem_size(uint32_t elt_num, size_t total_elt_sz, uint32_t pg_shift,
>  ssize_t
>  rte_mempool_xmem_usage(__rte_unused void *vaddr, uint32_t elt_num,
>  	size_t total_elt_sz, const phys_addr_t paddr[], uint32_t pg_num,
> -	uint32_t pg_shift, __rte_unused unsigned int flags)
> +	uint32_t pg_shift, unsigned int flags)
>  {
>  	uint32_t elt_cnt = 0;
>  	phys_addr_t start, end;
>  	uint32_t paddr_idx;
>  	size_t pg_sz = (size_t)1 << pg_shift;
>  
> +	if (flags & (MEMPOOL_F_CAPA_BLK_ALIGNED_OBJECTS |
> +			MEMPOOL_F_CAPA_PHYS_CONTIG))
> +		/* alignment need one additional object */
> +		elt_num += 1;
> +

Same here



More information about the dev mailing list