Skip to content

Commit

Permalink
PM / OPP: Add reference counting helpers for Rust implementation
Browse files Browse the repository at this point in the history
To ensure that resources such as OPP tables or OPP nodes are not freed
while in use by the Rust implementation, it is necessary to increment
their reference count from Rust code.

This commit introduces a new helper function,
dev_pm_opp_get_opp_table_ref(), to increment the reference count of an
OPP table and declares the existing helper dev_pm_opp_get() in pm_opp.h.

Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
  • Loading branch information
Viresh Kumar committed Jan 20, 2025
1 parent 1d38eb7 commit b489e79
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 6 deletions.
17 changes: 12 additions & 5 deletions drivers/opp/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -1528,11 +1528,6 @@ static struct opp_table *_allocate_opp_table(struct device *dev, int index)
return ERR_PTR(ret);
}

void _get_opp_table_kref(struct opp_table *opp_table)
{
kref_get(&opp_table->kref);
}

static struct opp_table *_update_opp_table_clk(struct device *dev,
struct opp_table *opp_table,
bool getclk)
Expand Down Expand Up @@ -1693,6 +1688,17 @@ static void _opp_table_kref_release(struct kref *kref)
kfree(opp_table);
}

void _get_opp_table_kref(struct opp_table *opp_table)
{
kref_get(&opp_table->kref);
}

void dev_pm_opp_get_opp_table_ref(struct opp_table *opp_table)
{
_get_opp_table_kref(opp_table);
}
EXPORT_SYMBOL_GPL(dev_pm_opp_get_opp_table_ref);

void dev_pm_opp_put_opp_table(struct opp_table *opp_table)
{
kref_put_mutex(&opp_table->kref, _opp_table_kref_release,
Expand Down Expand Up @@ -1727,6 +1733,7 @@ void dev_pm_opp_get(struct dev_pm_opp *opp)
{
kref_get(&opp->kref);
}
EXPORT_SYMBOL_GPL(dev_pm_opp_get);

void dev_pm_opp_put(struct dev_pm_opp *opp)
{
Expand Down
1 change: 0 additions & 1 deletion drivers/opp/opp.h
Original file line number Diff line number Diff line change
Expand Up @@ -250,7 +250,6 @@ struct opp_table {
};

/* Routines internal to opp core */
void dev_pm_opp_get(struct dev_pm_opp *opp);
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);
Expand Down
6 changes: 6 additions & 0 deletions include/linux/pm_opp.h
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ struct dev_pm_opp_data {
#if defined(CONFIG_PM_OPP)

struct opp_table *dev_pm_opp_get_opp_table(struct device *dev);
void dev_pm_opp_get_opp_table_ref(struct opp_table *opp_table);
void dev_pm_opp_put_opp_table(struct opp_table *opp_table);

unsigned long dev_pm_opp_get_bw(struct dev_pm_opp *opp, bool peak, int index);
Expand Down Expand Up @@ -160,6 +161,7 @@ struct dev_pm_opp *dev_pm_opp_find_bw_ceil(struct device *dev,
struct dev_pm_opp *dev_pm_opp_find_bw_floor(struct device *dev,
unsigned int *bw, int index);

void dev_pm_opp_get(struct dev_pm_opp *opp);
void dev_pm_opp_put(struct dev_pm_opp *opp);

int dev_pm_opp_add_dynamic(struct device *dev, struct dev_pm_opp_data *opp);
Expand Down Expand Up @@ -205,6 +207,8 @@ static inline struct opp_table *dev_pm_opp_get_opp_table_indexed(struct device *
return ERR_PTR(-EOPNOTSUPP);
}

static inline void dev_pm_opp_get_opp_table_ref(struct opp_table *opp_table) {}

static inline void dev_pm_opp_put_opp_table(struct opp_table *opp_table) {}

static inline unsigned long dev_pm_opp_get_bw(struct dev_pm_opp *opp, bool peak, int index)
Expand Down Expand Up @@ -341,6 +345,8 @@ static inline struct dev_pm_opp *dev_pm_opp_find_bw_floor(struct device *dev,
return ERR_PTR(-EOPNOTSUPP);
}

static inline void dev_pm_opp_get(struct dev_pm_opp *opp) {}

static inline void dev_pm_opp_put(struct dev_pm_opp *opp) {}

static inline int
Expand Down

0 comments on commit b489e79

Please sign in to comment.