Skip to content

Commit 6ce4184

Browse files
vireshkrafaeljw
authored andcommitted
PM / OPP: do error handling at the bottom of dev_pm_opp_add_dynamic()
This makes it less error prone and moves common resource deallocation at a single place. Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
1 parent 07cce74 commit 6ce4184

File tree

1 file changed

+10
-7
lines changed

1 file changed

+10
-7
lines changed

drivers/base/power/opp.c

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,7 @@ static int dev_pm_opp_add_dynamic(struct device *dev, unsigned long freq,
413413
struct device_opp *dev_opp = NULL;
414414
struct dev_pm_opp *opp, *new_opp;
415415
struct list_head *head;
416+
int ret;
416417

417418
/* allocate new OPP node */
418419
new_opp = kzalloc(sizeof(*new_opp), GFP_KERNEL);
@@ -435,9 +436,8 @@ static int dev_pm_opp_add_dynamic(struct device *dev, unsigned long freq,
435436
if (IS_ERR(dev_opp)) {
436437
dev_opp = add_device_opp(dev);
437438
if (!dev_opp) {
438-
mutex_unlock(&dev_opp_list_lock);
439-
kfree(new_opp);
440-
return -ENOMEM;
439+
ret = -ENOMEM;
440+
goto free_opp;
441441
}
442442

443443
head = &dev_opp->opp_list;
@@ -458,15 +458,13 @@ static int dev_pm_opp_add_dynamic(struct device *dev, unsigned long freq,
458458

459459
/* Duplicate OPPs ? */
460460
if (new_opp->rate == opp->rate) {
461-
int ret = opp->available && new_opp->u_volt == opp->u_volt ?
461+
ret = opp->available && new_opp->u_volt == opp->u_volt ?
462462
0 : -EEXIST;
463463

464464
dev_warn(dev, "%s: duplicate OPPs detected. Existing: freq: %lu, volt: %lu, enabled: %d. New: freq: %lu, volt: %lu, enabled: %d\n",
465465
__func__, opp->rate, opp->u_volt, opp->available,
466466
new_opp->rate, new_opp->u_volt, new_opp->available);
467-
mutex_unlock(&dev_opp_list_lock);
468-
kfree(new_opp);
469-
return ret;
467+
goto free_opp;
470468
}
471469

472470
list_add:
@@ -480,6 +478,11 @@ static int dev_pm_opp_add_dynamic(struct device *dev, unsigned long freq,
480478
*/
481479
srcu_notifier_call_chain(&dev_opp->srcu_head, OPP_EVENT_ADD, new_opp);
482480
return 0;
481+
482+
free_opp:
483+
mutex_unlock(&dev_opp_list_lock);
484+
kfree(new_opp);
485+
return ret;
483486
}
484487

485488
/**

0 commit comments

Comments
 (0)