Messages in this thread Patch in this message | | | From | Dmitry Osipenko <> | Subject | [PATCH v1] opp: Release current OPP properly | Date | Thu, 12 Aug 2021 13:13:53 +0300 |
| |
The current_opp is released only when whole OPP table is released, otherwise it's only marked as removed by dev_pm_opp_remove_table(). Functions like dev_pm_opp_put_clkname() and dev_pm_opp_put_supported_hw() are checking whether OPP table is empty and it's not if current_opp is set since it holds the refcount of OPP, this produces a noisy warning from these functions about busy OPP table. Release current_opp when OPP table is removed to fix it.
Cc: stable@vger.kernel.org Fixes: 81c4d8a3c414 ("opp: Keep track of currently programmed OPP") Signed-off-by: Dmitry Osipenko <digetx@gmail.com> --- drivers/opp/core.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/drivers/opp/core.c b/drivers/opp/core.c index b335c077f215..73da968b5c86 100644 --- a/drivers/opp/core.c +++ b/drivers/opp/core.c @@ -1378,9 +1378,6 @@ static void _opp_table_kref_release(struct kref *kref) list_del(&opp_table->node); mutex_unlock(&opp_table_lock); - if (opp_table->current_opp) - dev_pm_opp_put(opp_table->current_opp); - _of_clear_opp_table(opp_table); /* Release clk */ @@ -2901,6 +2898,12 @@ void dev_pm_opp_remove_table(struct device *dev) if (_opp_remove_all_static(opp_table)) dev_pm_opp_put_opp_table(opp_table); + /* Drop reference taken by _find_current_opp() */ + if (opp_table->current_opp) { + dev_pm_opp_put(opp_table->current_opp); + opp_table->current_opp = NULL; + } + /* Drop reference taken by _find_opp_table() */ dev_pm_opp_put_opp_table(opp_table); } -- 2.32.0
| |