Message ID | 20230306075651.2449-3-johan+linaro@kernel.org |
---|---|
State | Accepted |
Commit | e0e7089bf9a87bc5e3997422e4e24563424f9018 |
Headers | show |
Series | interconnect: fix racy provider registration | expand |
On Mon, 6 Mar 2023 08:56:30 +0100 Johan Hovold <johan+linaro@kernel.org> wrote: > The interconnect framework currently expects that providers are only > removed when there are no users and after all nodes have been removed. > > There is currently nothing that guarantees this to be the case and the > framework does not do any reference counting, but refusing to remove the > provider is never correct as that would leave a dangling pointer to a > resource that is about to be released in the global provider list (e.g. > accessible through debugfs). > > Replace the current sanity checks with WARN_ON() so that the provider is > always removed. > > Fixes: 11f1ceca7031 ("interconnect: Add generic on-chip interconnect API") > Cc: stable@vger.kernel.org # 5.1: 680f8666baf6: interconnect: Make icc_provider_del() return void > Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org> > Signed-off-by: Johan Hovold <johan+linaro@kernel.org> [Tested on i.MX8MP using an MSC SM2-MB-EP1 Board] Tested-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
diff --git a/drivers/interconnect/core.c b/drivers/interconnect/core.c index 5217f449eeec..cabb6f5df83e 100644 --- a/drivers/interconnect/core.c +++ b/drivers/interconnect/core.c @@ -1065,18 +1065,8 @@ EXPORT_SYMBOL_GPL(icc_provider_add); void icc_provider_del(struct icc_provider *provider) { mutex_lock(&icc_lock); - if (provider->users) { - pr_warn("interconnect provider still has %d users\n", - provider->users); - mutex_unlock(&icc_lock); - return; - } - - if (!list_empty(&provider->nodes)) { - pr_warn("interconnect provider still has nodes\n"); - mutex_unlock(&icc_lock); - return; - } + WARN_ON(provider->users); + WARN_ON(!list_empty(&provider->nodes)); list_del(&provider->provider_list); mutex_unlock(&icc_lock);