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

santosh santosh.shukla at caviumnetworks.com
Tue Sep 26 00:08:17 CEST 2017


On Monday 25 September 2017 12:32 PM, Olivier MATZ wrote:
> 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)

queued for v7. agree strict check. Thanks.

>> @@ -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