Re: [PATCH] dmaengine: sf-pdma: Fix an error that calls callback twice

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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
>>



[Index of Archives]     [Linux Kernel]     [Linux ARM (vger)]     [Linux ARM MSM]     [Linux Omap]     [Linux Arm]     [Linux Tegra]     [Fedora ARM]     [Linux for Samsung SOC]     [eCos]     [Linux PCI]     [Linux Fastboot]     [Gcc Help]     [Git]     [DCCP]     [IETF Announce]     [Security]     [Linux MIPS]     [Yosemite Campsites]

  Powered by Linux