Skip to content

Commit 173e02d

Browse files
committed
OPP: Initialize scope-based pointers inline
Uninitialized pointers with `__free` attribute can cause undefined behaviour as the memory allocated to the pointer is freed automatically when the pointer goes out of scope. The OPP core doesn't have any bugs related to this as of now, but it is better to initialize pointers marked with `__free` attribute at declaration to simplify the code and ensure proper scope-based cleanup. Reported-by: Joe Perches <joe@perches.com> Reported-by: Dan Carpenter <dan.carpenter@linaro.org> Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
1 parent e6fdbe8 commit 173e02d

3 files changed

Lines changed: 117 additions & 93 deletions

File tree

drivers/opp/core.c

Lines changed: 38 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -309,9 +309,9 @@ EXPORT_SYMBOL_GPL(dev_pm_opp_is_turbo);
309309
*/
310310
unsigned long dev_pm_opp_get_max_clock_latency(struct device *dev)
311311
{
312-
struct opp_table *opp_table __free(put_opp_table);
312+
struct opp_table *opp_table __free(put_opp_table) =
313+
_find_opp_table(dev);
313314

314-
opp_table = _find_opp_table(dev);
315315
if (IS_ERR(opp_table))
316316
return 0;
317317

@@ -327,7 +327,6 @@ EXPORT_SYMBOL_GPL(dev_pm_opp_get_max_clock_latency);
327327
*/
328328
unsigned long dev_pm_opp_get_max_volt_latency(struct device *dev)
329329
{
330-
struct opp_table *opp_table __free(put_opp_table);
331330
struct dev_pm_opp *opp;
332331
struct regulator *reg;
333332
unsigned long latency_ns = 0;
@@ -337,7 +336,9 @@ unsigned long dev_pm_opp_get_max_volt_latency(struct device *dev)
337336
unsigned long max;
338337
} *uV;
339338

340-
opp_table = _find_opp_table(dev);
339+
struct opp_table *opp_table __free(put_opp_table) =
340+
_find_opp_table(dev);
341+
341342
if (IS_ERR(opp_table))
342343
return 0;
343344

@@ -409,10 +410,11 @@ EXPORT_SYMBOL_GPL(dev_pm_opp_get_max_transition_latency);
409410
*/
410411
unsigned long dev_pm_opp_get_suspend_opp_freq(struct device *dev)
411412
{
412-
struct opp_table *opp_table __free(put_opp_table);
413413
unsigned long freq = 0;
414414

415-
opp_table = _find_opp_table(dev);
415+
struct opp_table *opp_table __free(put_opp_table) =
416+
_find_opp_table(dev);
417+
416418
if (IS_ERR(opp_table))
417419
return 0;
418420

@@ -447,9 +449,9 @@ int _get_opp_count(struct opp_table *opp_table)
447449
*/
448450
int dev_pm_opp_get_opp_count(struct device *dev)
449451
{
450-
struct opp_table *opp_table __free(put_opp_table);
452+
struct opp_table *opp_table __free(put_opp_table) =
453+
_find_opp_table(dev);
451454

452-
opp_table = _find_opp_table(dev);
453455
if (IS_ERR(opp_table)) {
454456
dev_dbg(dev, "%s: OPP table not found (%ld)\n",
455457
__func__, PTR_ERR(opp_table));
@@ -605,9 +607,9 @@ _find_key(struct device *dev, unsigned long *key, int index, bool available,
605607
unsigned long opp_key, unsigned long key),
606608
bool (*assert)(struct opp_table *opp_table, unsigned int index))
607609
{
608-
struct opp_table *opp_table __free(put_opp_table);
610+
struct opp_table *opp_table __free(put_opp_table) =
611+
_find_opp_table(dev);
609612

610-
opp_table = _find_opp_table(dev);
611613
if (IS_ERR(opp_table)) {
612614
dev_err(dev, "%s: OPP table not found (%ld)\n", __func__,
613615
PTR_ERR(opp_table));
@@ -1410,12 +1412,13 @@ static int _set_opp(struct device *dev, struct opp_table *opp_table,
14101412
*/
14111413
int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq)
14121414
{
1413-
struct opp_table *opp_table __free(put_opp_table);
14141415
struct dev_pm_opp *opp __free(put_opp) = NULL;
14151416
unsigned long freq = 0, temp_freq;
14161417
bool forced = false;
14171418

1418-
opp_table = _find_opp_table(dev);
1419+
struct opp_table *opp_table __free(put_opp_table) =
1420+
_find_opp_table(dev);
1421+
14191422
if (IS_ERR(opp_table)) {
14201423
dev_err(dev, "%s: device's opp table doesn't exist\n", __func__);
14211424
return PTR_ERR(opp_table);
@@ -1477,9 +1480,9 @@ EXPORT_SYMBOL_GPL(dev_pm_opp_set_rate);
14771480
*/
14781481
int dev_pm_opp_set_opp(struct device *dev, struct dev_pm_opp *opp)
14791482
{
1480-
struct opp_table *opp_table __free(put_opp_table);
1483+
struct opp_table *opp_table __free(put_opp_table) =
1484+
_find_opp_table(dev);
14811485

1482-
opp_table = _find_opp_table(dev);
14831486
if (IS_ERR(opp_table)) {
14841487
dev_err(dev, "%s: device opp doesn't exist\n", __func__);
14851488
return PTR_ERR(opp_table);
@@ -1794,10 +1797,11 @@ EXPORT_SYMBOL_GPL(dev_pm_opp_put);
17941797
*/
17951798
void dev_pm_opp_remove(struct device *dev, unsigned long freq)
17961799
{
1797-
struct opp_table *opp_table __free(put_opp_table);
17981800
struct dev_pm_opp *opp = NULL, *iter;
17991801

1800-
opp_table = _find_opp_table(dev);
1802+
struct opp_table *opp_table __free(put_opp_table) =
1803+
_find_opp_table(dev);
1804+
18011805
if (IS_ERR(opp_table))
18021806
return;
18031807

@@ -1885,9 +1889,9 @@ bool _opp_remove_all_static(struct opp_table *opp_table)
18851889
*/
18861890
void dev_pm_opp_remove_all_dynamic(struct device *dev)
18871891
{
1888-
struct opp_table *opp_table __free(put_opp_table);
1892+
struct opp_table *opp_table __free(put_opp_table) =
1893+
_find_opp_table(dev);
18891894

1890-
opp_table = _find_opp_table(dev);
18911895
if (IS_ERR(opp_table))
18921896
return;
18931897

@@ -2871,10 +2875,11 @@ static int _opp_set_availability(struct device *dev, unsigned long freq,
28712875
bool availability_req)
28722876
{
28732877
struct dev_pm_opp *opp __free(put_opp) = ERR_PTR(-ENODEV), *tmp_opp;
2874-
struct opp_table *opp_table __free(put_opp_table);
28752878

28762879
/* Find the opp_table */
2877-
opp_table = _find_opp_table(dev);
2880+
struct opp_table *opp_table __free(put_opp_table) =
2881+
_find_opp_table(dev);
2882+
28782883
if (IS_ERR(opp_table)) {
28792884
dev_warn(dev, "%s: Device OPP not found (%ld)\n", __func__,
28802885
PTR_ERR(opp_table));
@@ -2932,11 +2937,12 @@ int dev_pm_opp_adjust_voltage(struct device *dev, unsigned long freq,
29322937

29332938
{
29342939
struct dev_pm_opp *opp __free(put_opp) = ERR_PTR(-ENODEV), *tmp_opp;
2935-
struct opp_table *opp_table __free(put_opp_table);
29362940
int r;
29372941

29382942
/* Find the opp_table */
2939-
opp_table = _find_opp_table(dev);
2943+
struct opp_table *opp_table __free(put_opp_table) =
2944+
_find_opp_table(dev);
2945+
29402946
if (IS_ERR(opp_table)) {
29412947
r = PTR_ERR(opp_table);
29422948
dev_warn(dev, "%s: Device OPP not found (%d)\n", __func__, r);
@@ -2986,12 +2992,13 @@ EXPORT_SYMBOL_GPL(dev_pm_opp_adjust_voltage);
29862992
*/
29872993
int dev_pm_opp_sync_regulators(struct device *dev)
29882994
{
2989-
struct opp_table *opp_table __free(put_opp_table);
29902995
struct regulator *reg;
29912996
int ret, i;
29922997

29932998
/* Device may not have OPP table */
2994-
opp_table = _find_opp_table(dev);
2999+
struct opp_table *opp_table __free(put_opp_table) =
3000+
_find_opp_table(dev);
3001+
29953002
if (IS_ERR(opp_table))
29963003
return 0;
29973004

@@ -3062,9 +3069,9 @@ EXPORT_SYMBOL_GPL(dev_pm_opp_disable);
30623069
*/
30633070
int dev_pm_opp_register_notifier(struct device *dev, struct notifier_block *nb)
30643071
{
3065-
struct opp_table *opp_table __free(put_opp_table);
3072+
struct opp_table *opp_table __free(put_opp_table) =
3073+
_find_opp_table(dev);
30663074

3067-
opp_table = _find_opp_table(dev);
30683075
if (IS_ERR(opp_table))
30693076
return PTR_ERR(opp_table);
30703077

@@ -3082,9 +3089,9 @@ EXPORT_SYMBOL(dev_pm_opp_register_notifier);
30823089
int dev_pm_opp_unregister_notifier(struct device *dev,
30833090
struct notifier_block *nb)
30843091
{
3085-
struct opp_table *opp_table __free(put_opp_table);
3092+
struct opp_table *opp_table __free(put_opp_table) =
3093+
_find_opp_table(dev);
30863094

3087-
opp_table = _find_opp_table(dev);
30883095
if (IS_ERR(opp_table))
30893096
return PTR_ERR(opp_table);
30903097

@@ -3101,10 +3108,10 @@ EXPORT_SYMBOL(dev_pm_opp_unregister_notifier);
31013108
*/
31023109
void dev_pm_opp_remove_table(struct device *dev)
31033110
{
3104-
struct opp_table *opp_table __free(put_opp_table);
3105-
31063111
/* Check for existing table for 'dev' */
3107-
opp_table = _find_opp_table(dev);
3112+
struct opp_table *opp_table __free(put_opp_table) =
3113+
_find_opp_table(dev);
3114+
31083115
if (IS_ERR(opp_table)) {
31093116
int error = PTR_ERR(opp_table);
31103117

drivers/opp/cpu.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,10 @@ int dev_pm_opp_init_cpufreq_table(struct device *dev,
5656
return -ENOMEM;
5757

5858
for (i = 0, rate = 0; i < max_opps; i++, rate++) {
59-
struct dev_pm_opp *opp __free(put_opp);
60-
6159
/* find next rate */
62-
opp = dev_pm_opp_find_freq_ceil(dev, &rate);
60+
struct dev_pm_opp *opp __free(put_opp) =
61+
dev_pm_opp_find_freq_ceil(dev, &rate);
62+
6363
if (IS_ERR(opp)) {
6464
ret = PTR_ERR(opp);
6565
goto out;
@@ -154,12 +154,13 @@ EXPORT_SYMBOL_GPL(dev_pm_opp_cpumask_remove_table);
154154
int dev_pm_opp_set_sharing_cpus(struct device *cpu_dev,
155155
const struct cpumask *cpumask)
156156
{
157-
struct opp_table *opp_table __free(put_opp_table);
158157
struct opp_device *opp_dev;
159158
struct device *dev;
160159
int cpu;
161160

162-
opp_table = _find_opp_table(cpu_dev);
161+
struct opp_table *opp_table __free(put_opp_table) =
162+
_find_opp_table(cpu_dev);
163+
163164
if (IS_ERR(opp_table))
164165
return PTR_ERR(opp_table);
165166

@@ -201,10 +202,11 @@ EXPORT_SYMBOL_GPL(dev_pm_opp_set_sharing_cpus);
201202
*/
202203
int dev_pm_opp_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask)
203204
{
204-
struct opp_table *opp_table __free(put_opp_table);
205205
struct opp_device *opp_dev;
206206

207-
opp_table = _find_opp_table(cpu_dev);
207+
struct opp_table *opp_table __free(put_opp_table) =
208+
_find_opp_table(cpu_dev);
209+
208210
if (IS_ERR(opp_table))
209211
return PTR_ERR(opp_table);
210212

0 commit comments

Comments
 (0)