DMA Engine development
 help / color / mirror / Atom feed
* [PATCH v3 0/2] dmaengine: axi-dmac: move to device managed probe
@ 2024-02-22 15:15 Nuno Sa
  2024-02-22 15:15 ` [PATCH v3 1/2] dmaengine: axi-dmac: fix possible race in remove() Nuno Sa
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Nuno Sa @ 2024-02-22 15:15 UTC (permalink / raw)
  To: dmaengine; +Cc: Lars-Peter Clausen, Vinod Koul, stable

Added a new patch so we can easily backport a possible race in the
unbind path.

---
Changes in v3:
- Patch 1
  * New patch.
- Patch 2
  * Updated commit message (request_irq() is no longer moved).
- Link to v2: https://lore.kernel.org/r/20240219-axi-dmac-devm-probe-v2-1-1a6737294f69@analog.com

Changes in v2:
- Keep devm_request_irq() after of_dma_controller_register() so we free
  the irq first and avoid any possible race agains
  of_dma_controller_register().
- Link to v1: https://lore.kernel.org/r/20240214-axi-dmac-devm-probe-v1-1-22d633da19cb@analog.com

---
Nuno Sa (2):
      dmaengine: axi-dmac: fix possible race in remove()
      dmaengine: axi-dmac: move to device managed probe

 drivers/dma/dma-axi-dmac.c | 78 ++++++++++++++++++++--------------------------
 1 file changed, 34 insertions(+), 44 deletions(-)
---
base-commit: de7d9cb3b064fdfb2e0e7706d14ffee20b762ad2
change-id: 20240214-axi-dmac-devm-probe-d718ef36fb58
--

Thanks!
- Nuno Sá


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH v3 1/2] dmaengine: axi-dmac: fix possible race in remove()
  2024-02-22 15:15 [PATCH v3 0/2] dmaengine: axi-dmac: move to device managed probe Nuno Sa
@ 2024-02-22 15:15 ` Nuno Sa
  2024-02-22 15:15 ` [PATCH v3 2/2] dmaengine: axi-dmac: move to device managed probe Nuno Sa
  2024-04-07 16:38 ` (subset) [PATCH v3 0/2] " Vinod Koul
  2 siblings, 0 replies; 6+ messages in thread
From: Nuno Sa @ 2024-02-22 15:15 UTC (permalink / raw)
  To: dmaengine; +Cc: Lars-Peter Clausen, Vinod Koul, stable

We need to first free the IRQ before calling of_dma_controller_free().
Otherwise we could get an interrupt and schedule a tasklet while
removing the DMA controller.

Fixes: 0e3b67b348b8 ("dmaengine: Add support for the Analog Devices AXI-DMAC DMA controller")
Cc: <stable@kernel.org>
Signed-off-by: Nuno Sa <nuno.sa@analog.com>
---
 drivers/dma/dma-axi-dmac.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/dma/dma-axi-dmac.c b/drivers/dma/dma-axi-dmac.c
index 4e339c04fc1e..d5a33e4a91b1 100644
--- a/drivers/dma/dma-axi-dmac.c
+++ b/drivers/dma/dma-axi-dmac.c
@@ -1134,8 +1134,8 @@ static void axi_dmac_remove(struct platform_device *pdev)
 {
 	struct axi_dmac *dmac = platform_get_drvdata(pdev);
 
-	of_dma_controller_free(pdev->dev.of_node);
 	free_irq(dmac->irq, dmac);
+	of_dma_controller_free(pdev->dev.of_node);
 	tasklet_kill(&dmac->chan.vchan.task);
 	dma_async_device_unregister(&dmac->dma_dev);
 	clk_disable_unprepare(dmac->clk);

-- 
2.43.2


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH v3 2/2] dmaengine: axi-dmac: move to device managed probe
  2024-02-22 15:15 [PATCH v3 0/2] dmaengine: axi-dmac: move to device managed probe Nuno Sa
  2024-02-22 15:15 ` [PATCH v3 1/2] dmaengine: axi-dmac: fix possible race in remove() Nuno Sa
@ 2024-02-22 15:15 ` Nuno Sa
  2024-02-23  7:10   ` Vinod Koul
  2024-04-07 16:38 ` (subset) [PATCH v3 0/2] " Vinod Koul
  2 siblings, 1 reply; 6+ messages in thread
From: Nuno Sa @ 2024-02-22 15:15 UTC (permalink / raw)
  To: dmaengine; +Cc: Lars-Peter Clausen, Vinod Koul

In axi_dmac_probe(), there's a mix in using device managed APIs and
explicitly cleaning things in the driver .remove() hook. Move to use
device managed APIs and thus drop the .remove() hook.

Signed-off-by: Nuno Sa <nuno.sa@analog.com>
---
 drivers/dma/dma-axi-dmac.c | 78 ++++++++++++++++++++--------------------------
 1 file changed, 34 insertions(+), 44 deletions(-)

diff --git a/drivers/dma/dma-axi-dmac.c b/drivers/dma/dma-axi-dmac.c
index d5a33e4a91b1..bdb752f11869 100644
--- a/drivers/dma/dma-axi-dmac.c
+++ b/drivers/dma/dma-axi-dmac.c
@@ -1002,6 +1002,16 @@ static int axi_dmac_detect_caps(struct axi_dmac *dmac, unsigned int version)
 	return 0;
 }
 
+static void axi_dmac_tasklet_kill(void *task)
+{
+	tasklet_kill(task);
+}
+
+static void axi_dmac_free_dma_controller(void *of_node)
+{
+	of_dma_controller_free(of_node);
+}
+
 static int axi_dmac_probe(struct platform_device *pdev)
 {
 	struct dma_device *dma_dev;
@@ -1025,14 +1035,10 @@ static int axi_dmac_probe(struct platform_device *pdev)
 	if (IS_ERR(dmac->base))
 		return PTR_ERR(dmac->base);
 
-	dmac->clk = devm_clk_get(&pdev->dev, NULL);
+	dmac->clk = devm_clk_get_enabled(&pdev->dev, NULL);
 	if (IS_ERR(dmac->clk))
 		return PTR_ERR(dmac->clk);
 
-	ret = clk_prepare_enable(dmac->clk);
-	if (ret < 0)
-		return ret;
-
 	version = axi_dmac_read(dmac, ADI_AXI_REG_VERSION);
 
 	if (version >= ADI_AXI_PCORE_VER(4, 3, 'a'))
@@ -1041,7 +1047,7 @@ static int axi_dmac_probe(struct platform_device *pdev)
 		ret = axi_dmac_parse_dt(&pdev->dev, dmac);
 
 	if (ret < 0)
-		goto err_clk_disable;
+		return ret;
 
 	INIT_LIST_HEAD(&dmac->chan.active_descs);
 
@@ -1072,7 +1078,7 @@ static int axi_dmac_probe(struct platform_device *pdev)
 
 	ret = axi_dmac_detect_caps(dmac, version);
 	if (ret)
-		goto err_clk_disable;
+		return ret;
 
 	dma_dev->copy_align = (dmac->chan.address_align_mask + 1);
 
@@ -1088,57 +1094,42 @@ static int axi_dmac_probe(struct platform_device *pdev)
 		    !AXI_DMAC_DST_COHERENT_GET(ret)) {
 			dev_err(dmac->dma_dev.dev,
 				"Coherent DMA not supported in hardware");
-			ret = -EINVAL;
-			goto err_clk_disable;
+			return -EINVAL;
 		}
 	}
 
-	ret = dma_async_device_register(dma_dev);
+	ret = dmaenginem_async_device_register(dma_dev);
 	if (ret)
-		goto err_clk_disable;
+		return ret;
+
+	/*
+	 * Put the action in here so it get's done before unregistering the DMA
+	 * device.
+	 */
+	ret = devm_add_action_or_reset(&pdev->dev, axi_dmac_tasklet_kill,
+				       &dmac->chan.vchan.task);
+	if (ret)
+		return ret;
 
 	ret = of_dma_controller_register(pdev->dev.of_node,
 		of_dma_xlate_by_chan_id, dma_dev);
 	if (ret)
-		goto err_unregister_device;
+		return ret;
 
-	ret = request_irq(dmac->irq, axi_dmac_interrupt_handler, IRQF_SHARED,
-		dev_name(&pdev->dev), dmac);
+	ret = devm_add_action_or_reset(&pdev->dev, axi_dmac_free_dma_controller,
+				       pdev->dev.of_node);
 	if (ret)
-		goto err_unregister_of;
+		return ret;
 
-	platform_set_drvdata(pdev, dmac);
+	ret = devm_request_irq(&pdev->dev, dmac->irq, axi_dmac_interrupt_handler,
+			       IRQF_SHARED, dev_name(&pdev->dev), dmac);
+	if (ret)
+		return ret;
 
 	regmap = devm_regmap_init_mmio(&pdev->dev, dmac->base,
 		 &axi_dmac_regmap_config);
-	if (IS_ERR(regmap)) {
-		ret = PTR_ERR(regmap);
-		goto err_free_irq;
-	}
 
-	return 0;
-
-err_free_irq:
-	free_irq(dmac->irq, dmac);
-err_unregister_of:
-	of_dma_controller_free(pdev->dev.of_node);
-err_unregister_device:
-	dma_async_device_unregister(&dmac->dma_dev);
-err_clk_disable:
-	clk_disable_unprepare(dmac->clk);
-
-	return ret;
-}
-
-static void axi_dmac_remove(struct platform_device *pdev)
-{
-	struct axi_dmac *dmac = platform_get_drvdata(pdev);
-
-	free_irq(dmac->irq, dmac);
-	of_dma_controller_free(pdev->dev.of_node);
-	tasklet_kill(&dmac->chan.vchan.task);
-	dma_async_device_unregister(&dmac->dma_dev);
-	clk_disable_unprepare(dmac->clk);
+	return PTR_ERR_OR_ZERO(regmap);
 }
 
 static const struct of_device_id axi_dmac_of_match_table[] = {
@@ -1153,7 +1144,6 @@ static struct platform_driver axi_dmac_driver = {
 		.of_match_table = axi_dmac_of_match_table,
 	},
 	.probe = axi_dmac_probe,
-	.remove_new = axi_dmac_remove,
 };
 module_platform_driver(axi_dmac_driver);
 

-- 
2.43.2


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH v3 2/2] dmaengine: axi-dmac: move to device managed probe
  2024-02-22 15:15 ` [PATCH v3 2/2] dmaengine: axi-dmac: move to device managed probe Nuno Sa
@ 2024-02-23  7:10   ` Vinod Koul
  2024-02-23  9:07     ` Nuno Sá
  0 siblings, 1 reply; 6+ messages in thread
From: Vinod Koul @ 2024-02-23  7:10 UTC (permalink / raw)
  To: Nuno Sa; +Cc: dmaengine, Lars-Peter Clausen

On 22-02-24, 16:15, Nuno Sa wrote:
> In axi_dmac_probe(), there's a mix in using device managed APIs and
> explicitly cleaning things in the driver .remove() hook. Move to use
> device managed APIs and thus drop the .remove() hook.

This one fails for me somehow (applied on next after merging fixes with
patch1 on fixes)

-- 
~Vinod

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v3 2/2] dmaengine: axi-dmac: move to device managed probe
  2024-02-23  7:10   ` Vinod Koul
@ 2024-02-23  9:07     ` Nuno Sá
  0 siblings, 0 replies; 6+ messages in thread
From: Nuno Sá @ 2024-02-23  9:07 UTC (permalink / raw)
  To: Vinod Koul, Nuno Sa; +Cc: dmaengine, Lars-Peter Clausen

On Fri, 2024-02-23 at 12:40 +0530, Vinod Koul wrote:
> On 22-02-24, 16:15, Nuno Sa wrote:
> > In axi_dmac_probe(), there's a mix in using device managed APIs and
> > explicitly cleaning things in the driver .remove() hook. Move to use
> > device managed APIs and thus drop the .remove() hook.
> 
> This one fails for me somehow (applied on next after merging fixes with
> patch1 on fixes)
> 

Oh really?

They do apply for me (unless I'm doing something wrong):

b4 shazam 20240222-axi-dmac-devm-probe-v3-0-16bdca9e64d6@analog.com
Grabbing thread from
lore.kernel.org/all/20240222-axi-dmac-devm-probe-v3-0-16bdca9e64d6@analog.com/t.
mbox.gz
Checking for newer revisions
Grabbing search results from lore.kernel.org
Analyzing 4 messages in the thread
Looking for additional code-review trailers on lore.kernel.org
Checking attestation on all messages, may take a moment...
---
  ✓ [PATCH v3 1/2] dmaengine: axi-dmac: fix possible race in remove()
  ✓ [PATCH v3 2/2] dmaengine: axi-dmac: move to device managed probe
  ---
  ✓ Signed: ed25519/nuno.sa@analog.com
  ✓ Signed: DKIM/analog.com
---
Total patches: 2
---
 Base: using specified base-commit de7d9cb3b064fdfb2e0e7706d14ffee20b762ad2
Applying: dmaengine: axi-dmac: fix possible race in remove()
Applying: dmaengine: axi-dmac: move to device managed probe

I just applied them on top of dma-next. The tip is:

("dt-bindings: renesas,rcar-dmac: Add r8a779h0 support")

- Nuno Sá

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: (subset) [PATCH v3 0/2] dmaengine: axi-dmac: move to device managed probe
  2024-02-22 15:15 [PATCH v3 0/2] dmaengine: axi-dmac: move to device managed probe Nuno Sa
  2024-02-22 15:15 ` [PATCH v3 1/2] dmaengine: axi-dmac: fix possible race in remove() Nuno Sa
  2024-02-22 15:15 ` [PATCH v3 2/2] dmaengine: axi-dmac: move to device managed probe Nuno Sa
@ 2024-04-07 16:38 ` Vinod Koul
  2 siblings, 0 replies; 6+ messages in thread
From: Vinod Koul @ 2024-04-07 16:38 UTC (permalink / raw)
  To: dmaengine, Nuno Sa; +Cc: Lars-Peter Clausen, stable


On Thu, 22 Feb 2024 16:15:49 +0100, Nuno Sa wrote:
> Added a new patch so we can easily backport a possible race in the
> unbind path.
> 

Applied, thanks!

[2/2] dmaengine: axi-dmac: move to device managed probe
      commit: 779a44831a4f64616a2fb18256fc9c299e1c033a

Best regards,
-- 
~Vinod



^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2024-04-07 16:38 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-02-22 15:15 [PATCH v3 0/2] dmaengine: axi-dmac: move to device managed probe Nuno Sa
2024-02-22 15:15 ` [PATCH v3 1/2] dmaengine: axi-dmac: fix possible race in remove() Nuno Sa
2024-02-22 15:15 ` [PATCH v3 2/2] dmaengine: axi-dmac: move to device managed probe Nuno Sa
2024-02-23  7:10   ` Vinod Koul
2024-02-23  9:07     ` Nuno Sá
2024-04-07 16:38 ` (subset) [PATCH v3 0/2] " Vinod Koul

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox