Message ID | 20230306075651.2449-5-johan+linaro@kernel.org (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
Series | interconnect: fix racy provider registration | expand |
On Mon, 6 Mar 2023 08:56:32 +0100 Johan Hovold <johan+linaro@kernel.org> wrote: > The current interconnect provider registration interface is inherently > racy as nodes are not added until the after adding the provider. This > can specifically cause racing DT lookups to fail. > > Switch to using the new API where the provider is not registered until > after it has been fully initialised. > > Fixes: f0d8048525d7 ("interconnect: Add imx core driver") > Cc: stable@vger.kernel.org # 5.8 > Cc: Alexandre Bailon <abailon@baylibre.com> > Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org> > Tested-by: Luca Ceresoli <luca.ceresoli@bootlin.com> v2 works just as well, so my Tested-by is confirmed. Maybe it's useful mentioning the hardware used for testing so: [Tested on i.MX8MP using an MSC SM2-MB-EP1 Board] Tested-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
On Tue, Mar 07, 2023 at 10:43:24AM +0100, Luca Ceresoli wrote: > On Mon, 6 Mar 2023 08:56:32 +0100 > Johan Hovold <johan+linaro@kernel.org> wrote: > > > The current interconnect provider registration interface is inherently > > racy as nodes are not added until the after adding the provider. This > > can specifically cause racing DT lookups to fail. > > > > Switch to using the new API where the provider is not registered until > > after it has been fully initialised. > > > > Fixes: f0d8048525d7 ("interconnect: Add imx core driver") > > Cc: stable@vger.kernel.org # 5.8 > > Cc: Alexandre Bailon <abailon@baylibre.com> > > Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org> > > Tested-by: Luca Ceresoli <luca.ceresoli@bootlin.com> > > v2 works just as well, so my Tested-by is confirmed. Maybe it's useful > mentioning the hardware used for testing so: > > [Tested on i.MX8MP using an MSC SM2-MB-EP1 Board] > Tested-by: Luca Ceresoli <luca.ceresoli@bootlin.com> Thanks for reconfirming. Looks like Georgi has picked these up for 6.3-rc now. Johan
diff --git a/drivers/interconnect/imx/imx.c b/drivers/interconnect/imx/imx.c index 823d9be9771a..979ed610f704 100644 --- a/drivers/interconnect/imx/imx.c +++ b/drivers/interconnect/imx/imx.c @@ -295,6 +295,9 @@ int imx_icc_register(struct platform_device *pdev, provider->xlate = of_icc_xlate_onecell; provider->data = data; provider->dev = dev->parent; + + icc_provider_init(provider); + platform_set_drvdata(pdev, imx_provider); if (settings) { @@ -306,20 +309,18 @@ int imx_icc_register(struct platform_device *pdev, } } - ret = icc_provider_add(provider); - if (ret) { - dev_err(dev, "error adding interconnect provider: %d\n", ret); + ret = imx_icc_register_nodes(imx_provider, nodes, nodes_count, settings); + if (ret) return ret; - } - ret = imx_icc_register_nodes(imx_provider, nodes, nodes_count, settings); + ret = icc_provider_register(provider); if (ret) - goto provider_del; + goto err_unregister_nodes; return 0; -provider_del: - icc_provider_del(provider); +err_unregister_nodes: + imx_icc_unregister_nodes(&imx_provider->provider); return ret; } EXPORT_SYMBOL_GPL(imx_icc_register); @@ -328,9 +329,8 @@ void imx_icc_unregister(struct platform_device *pdev) { struct imx_icc_provider *imx_provider = platform_get_drvdata(pdev); + icc_provider_deregister(&imx_provider->provider); imx_icc_unregister_nodes(&imx_provider->provider); - - icc_provider_del(&imx_provider->provider); } EXPORT_SYMBOL_GPL(imx_icc_unregister);