On 03-03-20, 14:05, Sebastian von Ohr wrote: > The DMA transfer might finish just after checking the state with > dma_cookie_status, but before the lock is acquired. Not checking > for an empty list in xilinx_dma_tx_status may result in reading > random data or data corruption when desc is written to. This can > be reliably triggered by using dma_sync_wait to wait for DMA > completion. Appana, Radhey can you please test this..? > > Signed-off-by: Sebastian von Ohr <vonohr@xxxxxxxxxxx> > --- > drivers/dma/xilinx/xilinx_dma.c | 20 ++++++++++---------- > 1 file changed, 10 insertions(+), 10 deletions(-) > > diff --git a/drivers/dma/xilinx/xilinx_dma.c b/drivers/dma/xilinx/xilinx_dma.c > index a9c5d5cc9f2b..5d5f1d0ce16c 100644 > --- a/drivers/dma/xilinx/xilinx_dma.c > +++ b/drivers/dma/xilinx/xilinx_dma.c > @@ -1229,16 +1229,16 @@ static enum dma_status xilinx_dma_tx_status(struct dma_chan *dchan, > return ret; > > spin_lock_irqsave(&chan->lock, flags); > - > - desc = list_last_entry(&chan->active_list, > - struct xilinx_dma_tx_descriptor, node); > - /* > - * VDMA and simple mode do not support residue reporting, so the > - * residue field will always be 0. > - */ > - if (chan->has_sg && chan->xdev->dma_config->dmatype != XDMA_TYPE_VDMA) > - residue = xilinx_dma_get_residue(chan, desc); > - > + if (!list_empty(&chan->active_list)) { > + desc = list_last_entry(&chan->active_list, > + struct xilinx_dma_tx_descriptor, node); > + /* > + * VDMA and simple mode do not support residue reporting, so the > + * residue field will always be 0. > + */ > + if (chan->has_sg && chan->xdev->dma_config->dmatype != XDMA_TYPE_VDMA) > + residue = xilinx_dma_get_residue(chan, desc); > + } > spin_unlock_irqrestore(&chan->lock, flags); > > dma_set_residue(txstate, residue); > -- > 2.17.1 -- ~Vinod