Looks good to me. Tested-and-Reviewed-by: Green Wan <green.wan@xxxxxxxxxx> On Tue, Sep 1, 2020 at 9:43 AM Green Wan <green.wan@xxxxxxxxxx> wrote: > > Looks good to me. > > Tested-and-Reviewed-by: Green Wan <green.wan@xxxxxxxxxx> > > On Thu, Aug 27, 2020 at 9:33 PM Brad Kim <brad.kim@xxxxxxxxxx> wrote: >> >> Because a callback is called twice when DMA transfer complete >> the second callback may be possible to access a freed memory >> if the first callback routines perform the dma_release_channel function. >> So this patch serialized the callback functions >> >> Signed-off-by: Brad Kim <brad.kim@xxxxxxxxxxxx> >> --- >> drivers/dma/sf-pdma/sf-pdma.c | 10 +++++----- >> 1 file changed, 5 insertions(+), 5 deletions(-) >> >> diff --git a/drivers/dma/sf-pdma/sf-pdma.c b/drivers/dma/sf-pdma/sf-pdma.c >> index 6e530dca6d9e..754994087e5f 100644 >> --- a/drivers/dma/sf-pdma/sf-pdma.c >> +++ b/drivers/dma/sf-pdma/sf-pdma.c >> @@ -295,7 +295,10 @@ static void sf_pdma_donebh_tasklet(unsigned long arg) >> } >> spin_unlock_irqrestore(&chan->lock, flags); >> >> - dmaengine_desc_get_callback_invoke(desc->async_tx, NULL); >> + spin_lock_irqsave(&chan->vchan.lock, flags); >> + list_del(&chan->desc->vdesc.node); >> + vchan_cookie_complete(&chan->desc->vdesc); >> + spin_unlock_irqrestore(&chan->vchan.lock, flags); >> } >> >> static void sf_pdma_errbh_tasklet(unsigned long arg) >> @@ -332,8 +335,7 @@ static irqreturn_t sf_pdma_done_isr(int irq, void *dev_id) >> residue = readq(regs->residue); >> >> if (!residue) { >> - list_del(&chan->desc->vdesc.node); >> - vchan_cookie_complete(&chan->desc->vdesc); >> + tasklet_hi_schedule(&chan->done_tasklet); >> } else { >> /* submit next trascatioin if possible */ >> struct sf_pdma_desc *desc = chan->desc; >> @@ -347,8 +349,6 @@ static irqreturn_t sf_pdma_done_isr(int irq, void *dev_id) >> >> spin_unlock_irqrestore(&chan->vchan.lock, flags); >> >> - tasklet_hi_schedule(&chan->done_tasklet); >> - >> return IRQ_HANDLED; >> } >> >> -- >> 2.17.1 >>