Skip to content

Commit

Permalink
OPP: Don't take OPP table's kref for static OPPs
Browse files Browse the repository at this point in the history
The reference count is only required to be incremented for every call
that may lead to adding the OPP table. For static OPPs the same should
be done from the parent routine which adds all static OPPs together and
so only one refcount for all static OPPs.

Update code to reflect that.

The refcount is incremented every time a dynamic OPP is created (as that
can lead to creating the OPP table) and the same is dropped when the OPP
is removed.

Tested-by: Niklas Cassel <niklas.cassel@linaro.org>
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
  • Loading branch information
Viresh Kumar committed Sep 19, 2018
1 parent f06ed90 commit 0ad8c62
Showing 1 changed file with 6 additions and 5 deletions.
11 changes: 6 additions & 5 deletions drivers/opp/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -919,7 +919,6 @@ static void _opp_kref_release(struct kref *kref)
kfree(opp);

mutex_unlock(&opp_table->lock);
dev_pm_opp_put_opp_table(opp_table);
}

void dev_pm_opp_get(struct dev_pm_opp *opp)
Expand Down Expand Up @@ -963,11 +962,15 @@ void dev_pm_opp_remove(struct device *dev, unsigned long freq)

if (found) {
dev_pm_opp_put(opp);

/* Drop the reference taken by dev_pm_opp_add() */
dev_pm_opp_put_opp_table(opp_table);
} else {
dev_warn(dev, "%s: Couldn't find OPP with freq: %lu\n",
__func__, freq);
}

/* Drop the reference taken by _find_opp_table() */
dev_pm_opp_put_opp_table(opp_table);
}
EXPORT_SYMBOL_GPL(dev_pm_opp_remove);
Expand Down Expand Up @@ -1085,9 +1088,6 @@ int _opp_add(struct device *dev, struct dev_pm_opp *new_opp,
new_opp->opp_table = opp_table;
kref_init(&new_opp->kref);

/* Get a reference to the OPP table */
_get_opp_table_kref(opp_table);

ret = opp_debug_create_one(new_opp, opp_table);
if (ret)
dev_err(dev, "%s: Failed to register opp to debugfs (%d)\n",
Expand Down Expand Up @@ -1566,8 +1566,9 @@ int dev_pm_opp_add(struct device *dev, unsigned long freq, unsigned long u_volt)
return -ENOMEM;

ret = _opp_add_v1(opp_table, dev, freq, u_volt, true);
if (ret)
dev_pm_opp_put_opp_table(opp_table);

dev_pm_opp_put_opp_table(opp_table);
return ret;
}
EXPORT_SYMBOL_GPL(dev_pm_opp_add);
Expand Down

0 comments on commit 0ad8c62

Please sign in to comment.