Skip to content

Commit

Permalink
Merge branch 'opp/fixes' of git://git.kernel.org/pub/scm/linux/kernel…
Browse files Browse the repository at this point in the history
…/git/vireshk/pm

Pull operating performance points (OPP) framework fixes for 5.9-rc4 from
Viresh Kumar:

"This fixes reference counting for OPP tables. Few patches are getting
 queued (for various subsystems) for 5.10 which depend on this to be
 fixed first."

* 'opp/fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vireshk/pm:
  opp: Don't drop reference for an OPP table that was never parsed
  • Loading branch information
Rafael J. Wysocki committed Sep 1, 2020
2 parents f75aef3 + 922ff07 commit 763700f
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 7 deletions.
22 changes: 16 additions & 6 deletions drivers/opp/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -1296,13 +1296,19 @@ void dev_pm_opp_remove(struct device *dev, unsigned long freq)
}
EXPORT_SYMBOL_GPL(dev_pm_opp_remove);

void _opp_remove_all_static(struct opp_table *opp_table)
bool _opp_remove_all_static(struct opp_table *opp_table)
{
struct dev_pm_opp *opp, *tmp;
bool ret = true;

mutex_lock(&opp_table->lock);

if (!opp_table->parsed_static_opps || --opp_table->parsed_static_opps)
if (!opp_table->parsed_static_opps) {
ret = false;
goto unlock;
}

if (--opp_table->parsed_static_opps)
goto unlock;

list_for_each_entry_safe(opp, tmp, &opp_table->opp_list, node) {
Expand All @@ -1312,6 +1318,8 @@ void _opp_remove_all_static(struct opp_table *opp_table)

unlock:
mutex_unlock(&opp_table->lock);

return ret;
}

/**
Expand Down Expand Up @@ -2414,13 +2422,15 @@ void _dev_pm_opp_find_and_remove_table(struct device *dev)
return;
}

_opp_remove_all_static(opp_table);
/*
* Drop the extra reference only if the OPP table was successfully added
* with dev_pm_opp_of_add_table() earlier.
**/
if (_opp_remove_all_static(opp_table))
dev_pm_opp_put_opp_table(opp_table);

/* Drop reference taken by _find_opp_table() */
dev_pm_opp_put_opp_table(opp_table);

/* Drop reference taken while the OPP table was added */
dev_pm_opp_put_opp_table(opp_table);
}

/**
Expand Down
2 changes: 1 addition & 1 deletion drivers/opp/opp.h
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ struct opp_table {

/* Routines internal to opp core */
void dev_pm_opp_get(struct dev_pm_opp *opp);
void _opp_remove_all_static(struct opp_table *opp_table);
bool _opp_remove_all_static(struct opp_table *opp_table);
void _get_opp_table_kref(struct opp_table *opp_table);
int _get_opp_count(struct opp_table *opp_table);
struct opp_table *_find_opp_table(struct device *dev);
Expand Down

0 comments on commit 763700f

Please sign in to comment.