[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