* [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