Re: [PATCH 3/4] dmaengine: imx-sdma: implement channel termination via worker

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

 



Am Montag, den 03.09.2018, 08:59 +0000 schrieb Robin Gong:
> > -----Original Message-----
> > From: Lucas Stach <l.stach@xxxxxxxxxxxxxx>
> > Sent: 2018年9月3日 16:41
> > To: Robin Gong <yibin.gong@xxxxxxx>; Vinod Koul <vkoul@xxxxxxxxxx>
> > Cc: dmaengine@xxxxxxxxxxxxxxx; dl-linux-imx <linux-imx@xxxxxxx>;
> > kernel@xxxxxxxxxxxxxx; patchwork-lst@xxxxxxxxxxxxxx
> > Subject: Re: [PATCH 3/4] dmaengine: imx-sdma: implement channel
> > termination via worker
> > 
> > Hi Robin,
> > 
> > Am Freitag, den 31.08.2018, 09:49 +0000 schrieb Robin Gong:
> > > Hi Lucas,
> > > 	Seems I miss your previous mail. Thanks for your patch, but if
> > > move
> > > most jobs of sdma_disable_channel_with_delay() into worker, that
> > > will
> > > bring another race condition that upper driver such as Audio
> > > terminate
> > > channel and free resource of dma channel without really channel
> > > stop,
> > > if dma transfer done interrupt come after that, oops or kernel
> > > cash
> > > may be caught. Leave 'sdmac->desc = NULL' in the
> > 
> > sdma_disable_channel_with_delay() may fix such potential issue.
> > 
> > No, there is no such issue. The audio channel terminate will call
> > dmaengine_terminate_sync(), which internally calls
> > dmaengine_terminate_async() and then does a
> > dmaengine_synchronize(). As
> > this patchset implements the device_synchronize function in the
> > sdma driver,
> > this will wait for the worker to finish its execution, so there is
> > no race condition
> > to worry about here.
> > 
> > Regards,
> > Lucas
> 
> Yes, but how about other drivers which not call
> dmaengine_terminate_sync()?

Please read the dmaengine documentation. device_terminate_all has no
requirement that the transfer is actually canceled when the call
returns. If the caller needs a guarantee that the channel is stopped it
_must_ call device_synchronize.

For your convenience I'm copying the relevant part of the docs below
(from dmaengine_terminate_async(), which is what calls
device_terminate_all():

"Calling this function will terminate all active and pending
descriptors that have previously been submitted to the channel. It is
not guaranteed though that the transfer for the active descriptor has
stopped when the function returns. Furthermore it is possible the
complete callback of a submitted transfer is still running when this
function returns.

dmaengine_synchronize() needs to be called before it is safe to free
any memory that is accessed by previously submitted descriptors or
before freeing any resources accessed from within the completion
callback of any previously submitted descriptors."

Regards,
Lucas



[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