]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - drivers/cpufreq/cpufreq.c
l2tp: fix races with ipv4-mapped ipv6 addresses
[mirror_ubuntu-bionic-kernel.git] / drivers / cpufreq / cpufreq.c
index 41d148af77482a4f93bd2c415f936052302be507..6958ea487b3b29c279a8f5acab0a3c9e329dd8bd 100644 (file)
@@ -637,6 +637,8 @@ static int cpufreq_parse_governor(char *str_governor, unsigned int *policy,
                        *governor = t;
                        err = 0;
                }
+               if (t && !try_module_get(t->owner))
+                       t = NULL;
 
                mutex_unlock(&cpufreq_governor_mutex);
        }
@@ -765,6 +767,10 @@ static ssize_t store_scaling_governor(struct cpufreq_policy *policy,
                return -EINVAL;
 
        ret = cpufreq_set_policy(policy, &new_policy);
+
+       if (new_policy.governor)
+               module_put(new_policy.governor->owner);
+
        return ret ? ret : count;
 }
 
@@ -2455,6 +2461,20 @@ static int cpuhp_cpufreq_offline(unsigned int cpu)
        return 0;
 }
 
+static char cpufreq_driver_name[CPUFREQ_NAME_LEN];
+
+static int __init cpufreq_driver_setup(char *str)
+{
+       strlcpy(cpufreq_driver_name, str, CPUFREQ_NAME_LEN);
+       return 1;
+}
+
+/*
+ * Set this name to only allow one specific cpu freq driver, e.g.,
+ * cpufreq_driver=powernow-k8
+ */
+__setup("cpufreq_driver=", cpufreq_driver_setup);
+
 /**
  * cpufreq_register_driver - register a CPU Frequency driver
  * @driver_data: A struct cpufreq_driver containing the values#
@@ -2481,7 +2501,13 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
             (!!driver_data->get_intermediate != !!driver_data->target_intermediate))
                return -EINVAL;
 
-       pr_debug("trying to register driver %s\n", driver_data->name);
+       pr_debug("trying to register driver %s, cpufreq_driver=%s\n",
+               driver_data->name, cpufreq_driver_name);
+
+       if (cpufreq_driver_name[0])
+               if (!driver_data->name ||
+                       strcmp(cpufreq_driver_name, driver_data->name))
+                               return -EINVAL;
 
        /* Protect against concurrent CPU online/offline. */
        cpus_read_lock();