On Thu, Nov 1, 2018 at 10:38 AM Burakov, Anatoly <anatoly.bura...@intel.com>
wrote:

> On 31-Oct-18 5:29 PM, Alejandro Lucero wrote:
> > During memory initialization calling rte_mem_check_dma_mask
> > leads to a deadlock because memory_hotplug_lock is locked by a
> > writer, the current code in execution, and rte_memseg_walk
> > tries to lock as a reader.
> >
> > This patch adds safe and unsafe versions for invoking the final
> > function specifying if the memory_hotplug_lock needs to be
> > acquired, this is for the safe version, or not, the unsafe one.
> > PMDs should use the safe version and just internal EAL memory
> > code should use the unsafe one.
> >
> > Fixes: 223b7f1d5ef6 ("mem: add function for checking memseg IOVA")
> >
> > Signed-off-by: Alejandro Lucero <alejandro.luc...@netronome.com>
> > ---
>
> I don't think _safe and _unsafe are good names. _unsafe implies
> something might blow up, which isn't the case :) I think following the
> naming convention established by other functions (rte_mem_check_dma_mask
> and rte_mem_check_dma_mask_thread_unsafe) is better. User/driver code is
> only supposed to use rte_mem_check_dma_mask safe version anyway, so
> there's no need to differentiate between the two if the other one is
> never supposed to be used.
>
>
It makes sense. I will do it in next version.
Thanks


> >   drivers/net/nfp/nfp_net.c                  |  2 +-
> >   lib/librte_eal/common/eal_common_memory.c  | 24 +++++++++++++++---
> >   lib/librte_eal/common/include/rte_memory.h | 29 +++++++++++++++++++---
> >   lib/librte_eal/common/malloc_heap.c        |  2 +-
> >   lib/librte_eal/rte_eal_version.map         |  3 ++-
> >   5 files changed, 51 insertions(+), 9 deletions(-)
> >
>
> <...>
>
> > -/* check memsegs iovas are within a range based on dma mask */
> > -int __rte_experimental rte_mem_check_dma_mask(uint8_t maskbits);
> > +/**
> > + *  * @warning
>
> Here and in other places - same issue with extra star.
>
> > + * @b EXPERIMENTAL: this API may change without prior notice
> > + *
> > + *  Check memsegs iovas are within a range based on dma mask.
>
> The comments make it seem like the parameter is an actual DMA mask,
> rather than DMA mask *width*. In fact, you seem to have tripped yourself
> up on that already :)
>
> Suggested rewording:
>
> Check if all currently allocated memory segments are compliant with
> supplied DMA address width.
>
>
Ok.


> > + *
> > + *  @param maskbits
> > + *    Address width to check against.
> > + */
> > +int __rte_experimental rte_mem_check_dma_mask_safe(uint8_t maskbits);
> > +
> > +/**
> > + *  * @warning
> > + * @b EXPERIMENTAL: this API may change without prior notice
> > + *
> > + *  Check memsegs iovas are within a range based on dma mask without
> acquiring
> > + *  memory_hotplug_lock first.
> > + *
> > + *  This function is just for EAL core memory internal use. Drivers
> should
> > + *  use the previous safe one.
>
> This is IMO too detailed. Suggested rewording:
>
> Check if all currently allocated memory segments are compliant with
> supplied DMA address width.
>
>
Ok


> @warning This function is not thread-safe and is for internal use only.
>
> > + *
> > + *  @param maskbits
> > + *    Address width to check against.
> > + */
> > +int __rte_experimental rte_mem_check_dma_mask_unsafe(uint8_t maskbits);
> >
> >   /**
> >    *  * @warning
> >    * @b EXPERIMENTAL: this API may change without prior notice
> >    *
> >    *  Set dma mask to use once memory initialization is done.
> > - *  Previous function rte_mem_check_dma_mask can not be used
> > + *  Previous functions rte_mem_check_dma_mask_safe/unsafe can not be
> used
> >    *  safely until memory has been initialized.
> >    */
> >   void __rte_experimental rte_mem_set_dma_mask(uint8_t maskbits);
> > diff --git a/lib/librte_eal/common/malloc_heap.c
> b/lib/librte_eal/common/malloc_heap.c
> > index 711622f19..dd8b983e7 100644
> > --- a/lib/librte_eal/common/malloc_heap.c
> > +++ b/lib/librte_eal/common/malloc_heap.c
> > @@ -335,7 +335,7 @@ alloc_pages_on_heap(struct malloc_heap *heap,
> uint64_t pg_sz, size_t elt_size,
> >        * executed. For 2) implies the new memory can not be added.
> >        */
> >       if (mcfg->dma_maskbits) {
> > -             if (rte_mem_check_dma_mask(mcfg->dma_maskbits)) {
> > +             if (rte_mem_check_dma_mask_unsafe(mcfg->dma_maskbits)) {
> >                       /* Currently this can only happen if IOMMU is
> enabled
> >                        * with RTE_ARCH_X86. It is not safe to use this
> memory
> >                        * so returning an error here.
> > diff --git a/lib/librte_eal/rte_eal_version.map
> b/lib/librte_eal/rte_eal_version.map
> > index ae24b5c73..f863903b6 100644
> > --- a/lib/librte_eal/rte_eal_version.map
> > +++ b/lib/librte_eal/rte_eal_version.map
> > @@ -296,7 +296,8 @@ EXPERIMENTAL {
> >       rte_devargs_remove;
> >       rte_devargs_type_count;
> >       rte_mem_check_dma_mask;
> > -     rte_mem_set_dma_mask;
> > +     rte_mem_set_dma_mask_safe;
> > +     rte_mem_set_dma_mask_unsafe;
>
> Again, alphabet :)
>
> >       rte_eal_cleanup;
> >       rte_fbarray_attach;
> >       rte_fbarray_destroy;
> >
>
>
> --
> Thanks,
> Anatoly
>

Reply via email to