[dpdk-dev] [PATCH] ethdev: fix DMA zone reserve not honoring size

Burakov, Anatoly anatoly.burakov at intel.com
Mon Apr 1 11:40:38 CEST 2019


On 01-Apr-19 10:28 AM, Burakov, Anatoly wrote:
> On 01-Apr-19 8:30 AM, Andrew Rybchenko wrote:
>> On 3/31/19 7:25 PM, Pavan Nikhilesh Bhagavatula wrote:
>>> From: Pavan Nikhilesh <pbhagavatula at marvell.com>
>>>
>>> The `rte_eth_dma_zone_reserve()` is generally used to create HW rings.
>>> In some scenarios when a driver needs to reconfigure the ring size
>>> since the named memzone already exists it returns the previous memzone
>>> without checking if a different sized ring is requested.
>>>
>>> Introduce a check to see if the ring size requested is different from 
>>> the
>>> previously created memzone length.
>>>
>>> Fixes: 719dbebceb81 ("xen: allow determining DOM0 at runtime")
>>> Cc: stable at dpdk.org
>>>
>>> Signed-off-by: Pavan Nikhilesh <pbhagavatula at marvell.com>
>>> ---
>>>   lib/librte_ethdev/rte_ethdev.c | 5 ++++-
>>>   1 file changed, 4 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/lib/librte_ethdev/rte_ethdev.c 
>>> b/lib/librte_ethdev/rte_ethdev.c
>>> index 12b66b68c..4ae12e43b 100644
>>> --- a/lib/librte_ethdev/rte_ethdev.c
>>> +++ b/lib/librte_ethdev/rte_ethdev.c
>>> @@ -3604,9 +3604,12 @@ rte_eth_dma_zone_reserve(const struct 
>>> rte_eth_dev *dev, const char *ring_name,
>>>       }
>>>       mz = rte_memzone_lookup(z_name);
>>> -    if (mz)
>>> +    if (mz && (mz->len == size))
>>>           return mz;
>>> +    if (mz)
>>> +        rte_memzone_free(mz);
>>
>> NACK
>> I really don't like that API which should reserve does free if requested
>> size does not match previously allocated.
>> I understand the motivation, but I don't think the solution is correct.
> 
> Why does size change in the first place?

Never mind, i forgot that NICs can be reconfigured :)

Currently, there is no way to resize memzones, so freeing and 
reallocating is the only option. Since memzones are backed by regular 
malloc elements, we could add a memzone_resize API. That would help, 
because all of the references to the memzone itself will still be valid, 
even if memory ends up being reallocated.

> 
>>
>>> +
>>>       return rte_memzone_reserve_aligned(z_name, size, socket_id,
>>>               RTE_MEMZONE_IOVA_CONTIG, align);
>>>   }
>>
>>
> 
> 


-- 
Thanks,
Anatoly


More information about the dev mailing list