15/10/2021 11:59, fengchengwen:
> On 2021/10/15 16:29, Thomas Monjalon wrote:
> > 13/10/2021 09:41, Thomas Monjalon:
> >> 13/10/2021 02:21, fengchengwen:
> >>> On 2021/10/13 3:09, Thomas Monjalon wrote:
> >>>> 11/10/2021 09:33, Chengwen Feng:
> >>>>> +static void
> >>>>> +dma_release(struct rte_dma_dev *dev)
> >>>>> +{
> >>>>> +       rte_free(dev->dev_private);
> >>>>> +       memset(dev, 0, sizeof(struct rte_dma_dev));
> >>>>> +}
> >> [...]
> >>>>> +int
> >>>>> +rte_dma_pmd_release(const char *name)
> >>>>> +{
> >>>>> +       struct rte_dma_dev *dev;
> >>>>> +
> >>>>> +       if (dma_check_name(name) != 0)
> >>>>> +               return -EINVAL;
> >>>>> +
> >>>>> +       dev = dma_find_by_name(name);
> >>>>> +       if (dev == NULL)
> >>>>> +               return -EINVAL;
> >>>>> +
> >>>>> +       dma_release(dev);
> >>>>> +       return 0;
> >>>>> +}
> >>>>
> >>>> Trying to understand the logic of creation/destroy.
> >>>> skeldma_probe
> >>>> \-> skeldma_create
> >>>>     \-> rte_dma_pmd_allocate
> >>>>         \-> dma_allocate
> >>>>             \-> dma_data_prepare
> >>>>                 \-> dma_dev_data_prepare
> >>>> skeldma_remove
> >>>> \-> skeldma_destroy
> >>>>     \-> rte_dma_pmd_release
> >>>>         \-> dma_release
> >>>
> >>> This patch only provide device allocate function, the 2st patch provide 
> >>> extra logic:
> >>>
> >>>   diff --git a/lib/dmadev/rte_dmadev.c b/lib/dmadev/rte_dmadev.c
> >>>   index 42a4693bd9..a6a5680d2b 100644
> >>>   --- a/lib/dmadev/rte_dmadev.c
> >>>   +++ b/lib/dmadev/rte_dmadev.c
> >>>   @@ -201,6 +201,9 @@ rte_dma_pmd_release(const char *name)
> >>>           if (dev == NULL)
> >>>                   return -EINVAL;
> >>>
> >>>   +       if (dev->state == RTE_DMA_DEV_READY)
> >>>   +               return rte_dma_close(dev->dev_id);
> >>>   +
> >>>           dma_release(dev);
> >>>           return 0;
> >>>    }
> >>>
> >>> So the skeldma remove will be:
> >>>
> >>>  skeldma_remove
> >>>  \-> skeldma_destroy
> >>>      \-> rte_dma_pmd_release
> >>>          \-> rte_dma_close
> >>>              \-> dma_release
> >>
> >> OK, in this case, no need to dma_release from rte_dma_pmd_release,
> >> because it is already called from rte_dma_close.
> > 
> > Ping for reply please.
> 
> Sorry, I think the previous reply was enough, Let me explain:

No, if previous answer was enough, I would not add a new comment.
Please read again:
"
no need to dma_release from rte_dma_pmd_release,
because it is already called from rte_dma_close
"

> The PMD use following logic create dmadev:
>   skeldma_probe
>     \-> skeldma_create
>       \-> rte_dma_pmd_allocate
>         \-> dma_allocate
>       \-> mark dmadev state to READY.
> 
> The PMD remove will be:
>  skeldma_remove
>   \-> skeldma_destroy
>       \-> rte_dma_pmd_release
>           \-> rte_dma_close
>               \-> dma_release
> 
> The application close dmadev:
>   rte_dma_close
>    \-> dma_release
> 
> in the above case, the PMD remove and application close both call 
> rte_dma_close,
> I think that's what you expect.
> 
> 
> skeldma is simple, please let me give you a complicated example:
>   hisi_dma_probe
>     \-> hisi_dma_create
>       \-> rte_dma_pmd_allocate
>         \-> dma_allocate
>       \-> hisi_hw_init
>         \-> if init fail, call rte_dma_pmd_release.
>             \-> dma_release
>         \-> if init OK, mark dmadev state to READY.
> 
> as you can see, if hisi_hw_init fail, it call rte_dma_pmd_release to release 
> dmadev,
> it will direct call dma_release.
> if hisi_hw_init success, it mean the hardware also OK, then mark dmadev state 
> to
> READY. if PMD remove the dmadev it will call rte_dma_close because the 
> dmadev's state
> is READY, and the application could also call rte_dma_close to destroy dmadev.
> 
> 
> The rte_dma_pmd_release take two function:
> 1. if the dmadev's hardware part init fail, the PMD could use this function 
> release the
> dmadev.
> 2. if the dmadev's hardware part init success, the PMD could use this 
> function destroy
> the dmadev.
> 
> 
> If we don't have the rte_dma_pmd_release function, we should export 
> dma_release function
> which invoked when the hardware init fail.
> 
> And if we keep rte_dma_pmd_release, it correspond the rte_dma_pmd_allocate, 
> the PMD just
> invoke rte_dma_pmd_release to handle above both cases (hardware part init 
> fail when probe
> and remove phase).

You are justifying the existence of the functions, OK,
but I am just discussing one call of the function which is useless.

Anyway, now I am in the process of merging v26,
so I will send a fix.


Reply via email to