powercap/drivers/dtpm: Fix some missing unlock bugs
authorDan Carpenter <dan.carpenter@oracle.com>
Wed, 6 Jan 2021 08:41:09 +0000 (11:41 +0300)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 7 Jan 2021 17:13:51 +0000 (18:13 +0100)
We need to unlock on these paths before returning.

Fixes: a20d0ef97abf ("powercap/drivers/dtpm: Add API for dynamic thermal power management")
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Acked-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/powercap/dtpm.c

index d49df0569cd4f5d4443a00281a6aae14ebb95544..470a1182b868840f8966dae74a852afa74ac59de 100644 (file)
@@ -147,13 +147,17 @@ static void __dtpm_add_power(struct dtpm *dtpm)
  */
 int dtpm_update_power(struct dtpm *dtpm, u64 power_min, u64 power_max)
 {
+       int ret = 0;
+
        mutex_lock(&dtpm_lock);
 
        if (power_min == dtpm->power_min && power_max == dtpm->power_max)
-               return 0;
+               goto unlock;
 
-       if (power_max < power_min)
-               return -EINVAL;
+       if (power_max < power_min) {
+               ret = -EINVAL;
+               goto unlock;
+       }
 
        __dtpm_sub_power(dtpm);
 
@@ -164,9 +168,10 @@ int dtpm_update_power(struct dtpm *dtpm, u64 power_min, u64 power_max)
 
        __dtpm_add_power(dtpm);
 
+unlock:
        mutex_unlock(&dtpm_lock);
 
-       return 0;
+       return ret;
 }
 
 /**
@@ -187,8 +192,10 @@ int dtpm_release_zone(struct powercap_zone *pcz)
 
        mutex_lock(&dtpm_lock);
 
-       if (!list_empty(&dtpm->children))
+       if (!list_empty(&dtpm->children)) {
+               mutex_unlock(&dtpm_lock);
                return -EBUSY;
+       }
 
        if (parent)
                list_del(&dtpm->sibling);