return NULL;
 }
 
+static struct cpufreq_governor *get_governor(const char *str_governor)
+{
+       struct cpufreq_governor *t;
+
+       mutex_lock(&cpufreq_governor_mutex);
+       t = find_governor(str_governor);
+       if (!t)
+               goto unlock;
+
+       if (!try_module_get(t->owner))
+               t = NULL;
+
+unlock:
+       mutex_unlock(&cpufreq_governor_mutex);
+
+       return t;
+}
+
 static unsigned int cpufreq_parse_policy(char *str_governor)
 {
        if (!strncasecmp(str_governor, "performance", CPUFREQ_NAME_LEN))
 {
        struct cpufreq_governor *t;
 
-       mutex_lock(&cpufreq_governor_mutex);
-
-       t = find_governor(str_governor);
-       if (!t) {
-               int ret;
-
-               mutex_unlock(&cpufreq_governor_mutex);
-
-               ret = request_module("cpufreq_%s", str_governor);
-               if (ret)
-                       return NULL;
-
-               mutex_lock(&cpufreq_governor_mutex);
+       t = get_governor(str_governor);
+       if (t)
+               return t;
 
-               t = find_governor(str_governor);
-       }
-       if (t && !try_module_get(t->owner))
-               t = NULL;
-
-       mutex_unlock(&cpufreq_governor_mutex);
+       if (request_module("cpufreq_%s", str_governor))
+               return NULL;
 
-       return t;
+       return get_governor(str_governor);
 }
 
 /**
                goto out;
        }
 
+       mutex_lock(&cpufreq_governor_mutex);
        for_each_governor(t) {
                if (i >= (ssize_t) ((PAGE_SIZE / sizeof(char))
                    - (CPUFREQ_NAME_LEN + 2)))
-                       goto out;
+                       break;
                i += scnprintf(&buf[i], CPUFREQ_NAME_PLEN, "%s ", t->name);
        }
+       mutex_unlock(&cpufreq_governor_mutex);
 out:
        i += sprintf(&buf[i], "\n");
        return i;
        struct cpufreq_governor *def_gov = cpufreq_default_governor();
        struct cpufreq_governor *gov = NULL;
        unsigned int pol = CPUFREQ_POLICY_UNKNOWN;
+       int ret;
 
        if (has_target()) {
                /* Update policy governor to the one used before hotplug. */
-               gov = find_governor(policy->last_governor);
+               gov = get_governor(policy->last_governor);
                if (gov) {
                        pr_debug("Restoring governor %s for cpu %d\n",
                                 policy->governor->name, policy->cpu);
                } else if (def_gov) {
                        gov = def_gov;
+                       __module_get(gov->owner);
                } else {
                        return -ENODATA;
                }
                        return -ENODATA;
        }
 
-       return cpufreq_set_policy(policy, gov, pol);
+       ret = cpufreq_set_policy(policy, gov, pol);
+       if (gov)
+               module_put(gov->owner);
+
+       return ret;
 }
 
 static int cpufreq_add_policy_cpu(struct cpufreq_policy *policy, unsigned int cpu)