sched: Prevent balance_push() on remote runqueues
[linux-2.6-microblaze.git] / drivers / base / power / domain.c
index ab0b740..a934c67 100644 (file)
@@ -2018,8 +2018,8 @@ int pm_genpd_init(struct generic_pm_domain *genpd,
 
        mutex_lock(&gpd_list_lock);
        list_add(&genpd->gpd_list_node, &gpd_list);
-       genpd_debug_add(genpd);
        mutex_unlock(&gpd_list_lock);
+       genpd_debug_add(genpd);
 
        return 0;
 }
@@ -2206,12 +2206,19 @@ static int genpd_add_provider(struct device_node *np, genpd_xlate_t xlate,
 
 static bool genpd_present(const struct generic_pm_domain *genpd)
 {
+       bool ret = false;
        const struct generic_pm_domain *gpd;
 
-       list_for_each_entry(gpd, &gpd_list, gpd_list_node)
-               if (gpd == genpd)
-                       return true;
-       return false;
+       mutex_lock(&gpd_list_lock);
+       list_for_each_entry(gpd, &gpd_list, gpd_list_node) {
+               if (gpd == genpd) {
+                       ret = true;
+                       break;
+               }
+       }
+       mutex_unlock(&gpd_list_lock);
+
+       return ret;
 }
 
 /**
@@ -2222,15 +2229,13 @@ static bool genpd_present(const struct generic_pm_domain *genpd)
 int of_genpd_add_provider_simple(struct device_node *np,
                                 struct generic_pm_domain *genpd)
 {
-       int ret = -EINVAL;
+       int ret;
 
        if (!np || !genpd)
                return -EINVAL;
 
-       mutex_lock(&gpd_list_lock);
-
        if (!genpd_present(genpd))
-               goto unlock;
+               return -EINVAL;
 
        genpd->dev.of_node = np;
 
@@ -2241,7 +2246,7 @@ int of_genpd_add_provider_simple(struct device_node *np,
                        if (ret != -EPROBE_DEFER)
                                dev_err(&genpd->dev, "Failed to add OPP table: %d\n",
                                        ret);
-                       goto unlock;
+                       return ret;
                }
 
                /*
@@ -2259,16 +2264,13 @@ int of_genpd_add_provider_simple(struct device_node *np,
                        dev_pm_opp_of_remove_table(&genpd->dev);
                }
 
-               goto unlock;
+               return ret;
        }
 
        genpd->provider = &np->fwnode;
        genpd->has_provider = true;
 
-unlock:
-       mutex_unlock(&gpd_list_lock);
-
-       return ret;
+       return 0;
 }
 EXPORT_SYMBOL_GPL(of_genpd_add_provider_simple);
 
@@ -2287,8 +2289,6 @@ int of_genpd_add_provider_onecell(struct device_node *np,
        if (!np || !data)
                return -EINVAL;
 
-       mutex_lock(&gpd_list_lock);
-
        if (!data->xlate)
                data->xlate = genpd_xlate_onecell;
 
@@ -2328,8 +2328,6 @@ int of_genpd_add_provider_onecell(struct device_node *np,
        if (ret < 0)
                goto error;
 
-       mutex_unlock(&gpd_list_lock);
-
        return 0;
 
 error:
@@ -2348,8 +2346,6 @@ error:
                }
        }
 
-       mutex_unlock(&gpd_list_lock);
-
        return ret;
 }
 EXPORT_SYMBOL_GPL(of_genpd_add_provider_onecell);