cpufreq: Notify governors when cpus are hot-[un]plugged
authorViresh Kumar <viresh.kumar@linaro.org>
Sat, 12 Jan 2013 05:14:39 +0000 (05:14 +0000)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Fri, 1 Feb 2013 23:01:14 +0000 (00:01 +0100)
Because cpufreq core and governors worry only about the online cpus, if a cpu is
hot [un]plugged, we must notify governors about it, otherwise be ready to expect
something unexpected.

We already have notifiers in the form of CPUFREQ_GOV_START/CPUFREQ_GOV_STOP, we
just need to call them now.

Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/cpufreq/cpufreq.c

index de99517..a0a33bd 100644 (file)
@@ -751,11 +751,16 @@ static int cpufreq_add_dev_policy(unsigned int cpu,
                                return -EBUSY;
                        }
 
+                       __cpufreq_governor(managed_policy, CPUFREQ_GOV_STOP);
+
                        spin_lock_irqsave(&cpufreq_driver_lock, flags);
                        cpumask_copy(managed_policy->cpus, policy->cpus);
                        per_cpu(cpufreq_cpu_data, cpu) = managed_policy;
                        spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
 
+                       __cpufreq_governor(managed_policy, CPUFREQ_GOV_START);
+                       __cpufreq_governor(managed_policy, CPUFREQ_GOV_LIMITS);
+
                        pr_debug("CPU already managed, adding link\n");
                        ret = sysfs_create_link(&dev->kobj,
                                                &managed_policy->kobj,
@@ -1066,8 +1071,13 @@ static int __cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif
         */
        if (unlikely(cpu != data->cpu)) {
                pr_debug("removing link\n");
+               __cpufreq_governor(data, CPUFREQ_GOV_STOP);
                cpumask_clear_cpu(cpu, data->cpus);
                spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
+
+               __cpufreq_governor(data, CPUFREQ_GOV_START);
+               __cpufreq_governor(data, CPUFREQ_GOV_LIMITS);
+
                kobj = &dev->kobj;
                cpufreq_cpu_put(data);
                unlock_policy_rwsem_write(cpu);