提交 5553055c 编写于 作者: J Johan Hovold 提交者: Georgi Djakov

memory: tegra: fix interconnect registration race

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: 06f07981 ("memory: tegra-mc: Add interconnect framework")
Cc: stable@vger.kernel.org      # 5.11
Cc: Dmitry Osipenko <digetx@gmail.com>
Acked-by: NKrzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Signed-off-by: NJohan Hovold <johan+linaro@kernel.org>
Link: https://lore.kernel.org/r/20230306075651.2449-18-johan+linaro@kernel.orgSigned-off-by: NGeorgi Djakov <djakov@kernel.org>
上级 859ad5f1
...@@ -794,16 +794,12 @@ static int tegra_mc_interconnect_setup(struct tegra_mc *mc) ...@@ -794,16 +794,12 @@ static int tegra_mc_interconnect_setup(struct tegra_mc *mc)
mc->provider.aggregate = mc->soc->icc_ops->aggregate; mc->provider.aggregate = mc->soc->icc_ops->aggregate;
mc->provider.xlate_extended = mc->soc->icc_ops->xlate_extended; mc->provider.xlate_extended = mc->soc->icc_ops->xlate_extended;
err = icc_provider_add(&mc->provider); icc_provider_init(&mc->provider);
if (err)
return err;
/* create Memory Controller node */ /* create Memory Controller node */
node = icc_node_create(TEGRA_ICC_MC); node = icc_node_create(TEGRA_ICC_MC);
if (IS_ERR(node)) { if (IS_ERR(node))
err = PTR_ERR(node); return PTR_ERR(node);
goto del_provider;
}
node->name = "Memory Controller"; node->name = "Memory Controller";
icc_node_add(node, &mc->provider); icc_node_add(node, &mc->provider);
...@@ -830,12 +826,14 @@ static int tegra_mc_interconnect_setup(struct tegra_mc *mc) ...@@ -830,12 +826,14 @@ static int tegra_mc_interconnect_setup(struct tegra_mc *mc)
goto remove_nodes; goto remove_nodes;
} }
err = icc_provider_register(&mc->provider);
if (err)
goto remove_nodes;
return 0; return 0;
remove_nodes: remove_nodes:
icc_nodes_remove(&mc->provider); icc_nodes_remove(&mc->provider);
del_provider:
icc_provider_del(&mc->provider);
return err; return err;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册