Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751544AbdGRP4H (ORCPT ); Tue, 18 Jul 2017 11:56:07 -0400 Received: from mga14.intel.com ([192.55.52.115]:39707 "EHLO mga14.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751424AbdGRP4F (ORCPT ); Tue, 18 Jul 2017 11:56:05 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.40,378,1496127600"; d="scan'208";a="128141027" Date: Tue, 18 Jul 2017 21:28:25 +0530 From: Vinod Koul To: John Stultz Cc: lkml , Antonio Borneo , Dan Williams , Zhangfei Gao , dmaengine@vger.kernel.org Subject: Re: [PATCH] dma: k3dma: Fix non-cyclic mode Message-ID: <20170718155824.GT3053@localhost> References: <1499720023-6187-1-git-send-email-john.stultz@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1499720023-6187-1-git-send-email-john.stultz@linaro.org> User-Agent: Mutt/1.5.24 (2015-08-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2548 Lines: 82 On Mon, Jul 10, 2017 at 01:53:43PM -0700, John Stultz wrote: > From: Antonio Borneo > > Commit 36387a2b1f62b5c087c5fe6f0f7b23b94f722ad7 ("k3dma: Fix > memory handling in preparation for cyclic mode") broke the > logic around ds_run/ds_done in case of non-cyclic DMA. > > This went unnoticed as the only user of k3dma was the i2s > audio driver, but with a patch set to enable dma on SPI, > the issue cropped up. > > This patch resolves the issue by reverting part of the > problematic commit. Can you explain the fix here, how reverting helps around with that? Right now am not able to comprehend the fix on this.. > This patch has been tested to ensure both audio playback and SPI > works fine using DMA and that no memory leak is present. > > Cc: Vinod Koul > Cc: Dan Williams > Cc: Zhangfei Gao > Cc: dmaengine@vger.kernel.org > Signed-off-by: Antonio Borneo > [jstultz: Expanded commit message a bit] > Signed-off-by: John Stultz > --- > drivers/dma/k3dma.c | 12 ++++-------- > 1 file changed, 4 insertions(+), 8 deletions(-) > > diff --git a/drivers/dma/k3dma.c b/drivers/dma/k3dma.c > index 01e25c6..01d2a75 100644 > --- a/drivers/dma/k3dma.c > +++ b/drivers/dma/k3dma.c > @@ -223,7 +223,6 @@ static irqreturn_t k3_dma_int_handler(int irq, void *dev_id) > if (c && (tc1 & BIT(i))) { > spin_lock_irqsave(&c->vc.lock, flags); > vchan_cookie_complete(&p->ds_run->vd); > - WARN_ON_ONCE(p->ds_done); > p->ds_done = p->ds_run; > p->ds_run = NULL; > spin_unlock_irqrestore(&c->vc.lock, flags); > @@ -274,13 +273,14 @@ static int k3_dma_start_txd(struct k3_dma_chan *c) > */ > list_del(&ds->vd.node); > > - WARN_ON_ONCE(c->phy->ds_run); > - WARN_ON_ONCE(c->phy->ds_done); Not sure why WARN_ON should be removed? > c->phy->ds_run = ds; > + c->phy->ds_done = NULL; > /* start dma */ > k3_dma_set_desc(c->phy, &ds->desc_hw[0]); > return 0; > } > + c->phy->ds_run = NULL; > + c->phy->ds_done = NULL; > return -EAGAIN; > } > > @@ -722,11 +722,7 @@ static int k3_dma_terminate_all(struct dma_chan *chan) > k3_dma_free_desc(&p->ds_run->vd); > p->ds_run = NULL; > } > - if (p->ds_done) { > - k3_dma_free_desc(&p->ds_done->vd); > - p->ds_done = NULL; > - } > - > + p->ds_done = NULL; > } > spin_unlock_irqrestore(&c->vc.lock, flags); > vchan_dma_desc_free_list(&c->vc, &head); > -- > 2.7.4 > -- ~Vinod