On Mon, Dec 09, 2019 at 09:48:22AM +0200, Peter Ujfalusi wrote: > Hi Sascha, > > > On 06/12/2019 15.53, Sascha Hauer wrote: > > vchan_vdesc_fini() shouldn't be called under a spin_lock. This is done > > in two places, once in vchan_terminate_vdesc() and once in > > vchan_synchronize(). Instead of freeing the vdesc right away, collect > > the aborted vdescs on a separate list and free them along with the other > > vdescs. > > > > Signed-off-by: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> > > --- > > drivers/dma/virt-dma.c | 1 + > > drivers/dma/virt-dma.h | 17 +++-------------- > > 2 files changed, 4 insertions(+), 14 deletions(-) > > > > diff --git a/drivers/dma/virt-dma.c b/drivers/dma/virt-dma.c > > index ec4adf4260a0..87d5bd53c98b 100644 > > --- a/drivers/dma/virt-dma.c > > +++ b/drivers/dma/virt-dma.c > > @@ -135,6 +135,7 @@ void vchan_init(struct virt_dma_chan *vc, struct dma_device *dmadev) > > INIT_LIST_HEAD(&vc->desc_submitted); > > INIT_LIST_HEAD(&vc->desc_issued); > > INIT_LIST_HEAD(&vc->desc_completed); > > + INIT_LIST_HEAD(&vc->desc_aborted); > > Can we keep the terminated term instead of aborted: desc_terminated Sure. > > tasklet_kill(&vc->task); > > - > > - spin_lock_irqsave(&vc->lock, flags); > > - if (vc->vd_terminated) { > > - vchan_vdesc_fini(vc->vd_terminated); > > - vc->vd_terminated = NULL; > > - } > > - spin_unlock_irqrestore(&vc->lock, flags); > > We don't want the terminated descriptors to accumulate until the channel > is freed up. Nothing easier than that. I just have to revert to an earlier version before I decided that it's better to free up the descriptors at the end ;) I'll send a v2 shortly. Sascha -- Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |