Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1701426 > unrolled thread

[PATCH v2 0/3] dmaengine: k3dma: Fix non-cyclic mode

Started byAntonio Borneo <borneo.antonio@gmail.com>
First post2017-08-01 22:20 +0200
Last post2017-08-01 22:20 +0200
Articles 4 — 1 participant

Back to article view | Back to linux.kernel

This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by below is the oldest one visible, not the original post.


Contents

  [PATCH v2 0/3] dmaengine: k3dma: Fix non-cyclic mode Antonio Borneo <borneo.antonio@gmail.com> - 2017-08-01 22:20 +0200
    [PATCH v2 1/3] dmaengine: k3dma: fix non-cyclic mode Antonio Borneo <borneo.antonio@gmail.com> - 2017-08-01 22:20 +0200
    [PATCH v2 2/3] dmaengine: k3dma: fix double free of descriptor Antonio Borneo <borneo.antonio@gmail.com> - 2017-08-01 22:20 +0200
    [PATCH v2 3/3] dmaengine: k3dma: remove useless ON_WARN_ONCE() Antonio Borneo <borneo.antonio@gmail.com> - 2017-08-01 22:20 +0200

#1701426 — [PATCH v2 0/3] dmaengine: k3dma: Fix non-cyclic mode

FromAntonio Borneo <borneo.antonio@gmail.com>
Date2017-08-01 22:20 +0200
Subject[PATCH v2 0/3] dmaengine: k3dma: Fix non-cyclic mode
Message-ID<u9LO2-9K-15@gated-at.bofh.it>
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 v2 splits the initial patch in three parts:
- the real fix for non-cyclic mode
- another fix for a double free introduced in the same commit
- cosmetic removal of useless ON_WARN_ONCE()

Thread in https://patchwork.kernel.org/patch/9833791/

v1 -> v2
- split the patch
- change patch title to "dmaengine: ..."

Antonio Borneo (3):
  dmaengine: k3dma: fix non-cyclic mode
  dmaengine: k3dma: fix double free of descriptor
  dmaengine: k3dma: remove useless ON_WARN_ONCE()

 drivers/dma/k3dma.c | 12 ++++--------
 1 file changed, 4 insertions(+), 8 deletions(-)

-- 
1.9.1

[toc] | [next] | [standalone]


#1701430 — [PATCH v2 1/3] dmaengine: k3dma: fix non-cyclic mode

FromAntonio Borneo <borneo.antonio@gmail.com>
Date2017-08-01 22:20 +0200
Subject[PATCH v2 1/3] dmaengine: k3dma: fix non-cyclic mode
Message-ID<u9LO2-9K-23@gated-at.bofh.it>
In reply to#1701426
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 popped out.

The fix re-applies the initialization to ds_run/ds_done in
k3_dma_start_txd() that were removed by the commit above.

Also, one of the calls to k3_dma_start_txd() is triggered by
(ds_done != NULL), so remove the noisy and useless call to
WARN_ON_ONCE().

Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com>
---
To: dmaengine@vger.kernel.org
To: Vinod Koul <vinod.koul@intel.com>
To: Dan Williams <dan.j.williams@intel.com>
Cc: linux-kernel@vger.kernel.org
Cc: John Stultz <john.stultz@linaro.org>
Cc: Zhangfei Gao <zhangfei.gao@linaro.org>
---
 drivers/dma/k3dma.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/dma/k3dma.c b/drivers/dma/k3dma.c
index 01e25c6..c00eb12 100644
--- a/drivers/dma/k3dma.c
+++ b/drivers/dma/k3dma.c
@@ -275,12 +275,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);
 		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;
 }
 
-- 
1.9.1

[toc] | [prev] | [next] | [standalone]


#1701431 — [PATCH v2 2/3] dmaengine: k3dma: fix double free of descriptor

FromAntonio Borneo <borneo.antonio@gmail.com>
Date2017-08-01 22:20 +0200
Subject[PATCH v2 2/3] dmaengine: k3dma: fix double free of descriptor
Message-ID<u9LO2-9K-25@gated-at.bofh.it>
In reply to#1701426
Commit 36387a2b1f62b5c087c5fe6f0f7b23b94f722ad7 ("k3dma: Fix
memory handling in preparation for cyclic mode") adds code
to free the descriptor in ds_done.

In cyclic mode, ds_done is never used and it's always NULL,
so the added code is not executed.

In non-cyclic mode, ds_done is used as a flag: when not NULL
it signals that the descriptor has been consumed. No need to
free it because it would be free by vchan_complete().

The fix takes back the code changed by the commit above:
- remove the free on the descriptor;
- initialize ds_done to NULL for the next run.

Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com>
---
To: dmaengine@vger.kernel.org
To: Vinod Koul <vinod.koul@intel.com>
To: Dan Williams <dan.j.williams@intel.com>
Cc: linux-kernel@vger.kernel.org
Cc: John Stultz <john.stultz@linaro.org>
Cc: Zhangfei Gao <zhangfei.gao@linaro.org>
---
 drivers/dma/k3dma.c | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)

diff --git a/drivers/dma/k3dma.c b/drivers/dma/k3dma.c
index c00eb12..b769623 100644
--- a/drivers/dma/k3dma.c
+++ b/drivers/dma/k3dma.c
@@ -724,11 +724,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);
-- 
1.9.1

[toc] | [prev] | [next] | [standalone]


#1701435 — [PATCH v2 3/3] dmaengine: k3dma: remove useless ON_WARN_ONCE()

FromAntonio Borneo <borneo.antonio@gmail.com>
Date2017-08-01 22:20 +0200
Subject[PATCH v2 3/3] dmaengine: k3dma: remove useless ON_WARN_ONCE()
Message-ID<u9LO2-9K-31@gated-at.bofh.it>
In reply to#1701426
Commit 36387a2b1f62b5c087c5fe6f0f7b23b94f722ad7 ("k3dma: Fix
memory handling in preparation for cyclic mode") adds few
calls to ON_WARN_ONCE() to track the use of ds_run/ds_done.

After the two fixes:
- dmaengine: k3dma: fix non-cyclic mode
- dmaengine: k3dma: fix re-free of the same descriptor
the behaviour of ds_run/ds_done is properly fixed.
The remaining ON_WARN_ONCE() are never triggered and can be
removed.

Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com>
---
To: dmaengine@vger.kernel.org
To: Vinod Koul <vinod.koul@intel.com>
To: Dan Williams <dan.j.williams@intel.com>
Cc: linux-kernel@vger.kernel.org
Cc: John Stultz <john.stultz@linaro.org>
Cc: Zhangfei Gao <zhangfei.gao@linaro.org>
---
 drivers/dma/k3dma.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/drivers/dma/k3dma.c b/drivers/dma/k3dma.c
index b769623..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,7 +273,6 @@ static int k3_dma_start_txd(struct k3_dma_chan *c)
 		 */
 		list_del(&ds->vd.node);
 
-		WARN_ON_ONCE(c->phy->ds_run);
 		c->phy->ds_run = ds;
 		c->phy->ds_done = NULL;
 		/* start dma */
-- 
1.9.1

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web