Message ID | 20220718133632.937290-2-windhl@126.com |
---|---|
State | New |
Headers | show |
Series | [v2,1/2] OPP: Fix refcount leak bug for opp_table | expand |
diff --git a/drivers/opp/core.c b/drivers/opp/core.c index cc2671322e41..2f7988a05cb7 100644 --- a/drivers/opp/core.c +++ b/drivers/opp/core.c @@ -1549,6 +1549,7 @@ static void _opp_kref_release(struct kref *kref) list_del(&opp->node); mutex_unlock(&opp_table->lock); + of_node_put(opp->np); /* * Notify the changes in the availability of the operable * frequency/voltage list. diff --git a/drivers/opp/of.c b/drivers/opp/of.c index 374544afe9e4..ac4a3ff12677 100644 --- a/drivers/opp/of.c +++ b/drivers/opp/of.c @@ -937,7 +937,7 @@ static struct dev_pm_opp *_opp_add_static_v2(struct opp_table *opp_table, new_opp->turbo = of_property_read_bool(np, "turbo-mode"); - new_opp->np = np; + new_opp->np = of_node_get(np); new_opp->dynamic = false; new_opp->available = true;
In _opp_add_static_v2(), we need call of_node_get() for the new reference created when "new_opp->np = np;" as new_opp is escaped out. Here we should also take care of the of_node_put() when 'new_opp' is freed based on the function description: "The opp can be controlled ... and may be removed by dev_pm_opp_remove". For example, _opp_add_static_v2() is called by _of_add_opp_table_v2() in a for_each_available_child_of_node() which will automatically increase and decrease the refcount. So we need an additional of_node_get() for the new reference created in _opp_add_static_v2(). Signed-off-by: Liang He <windhl@126.com> --- drivers/opp/core.c | 1 + drivers/opp/of.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-)