thermal: cpu_cooling: Fix power calculation when CPUs are offline
authorKapileshwar Singh <kapileshwar.singh@arm.com>
Mon, 16 Mar 2015 12:00:51 +0000 (12:00 +0000)
committerEduardo Valentin <edubezval@gmail.com>
Tue, 5 May 2015 04:27:54 +0000 (21:27 -0700)
Ensure that the CPU for which the frequency is being requested
is online. If none of the CPUs are online the requested power is
returned as 0.

Acked-by: Javi Merino <javi.merino@arm.com>
Signed-off-by: Kapileshwar Singh <kapileshwar.singh@arm.com>
Signed-off-by: Eduardo Valentin <edubezval@gmail.com>
drivers/thermal/cpu_cooling.c

index beffa556488a186f0e55398d63254792cfb998e8..6509c61b96484993333a4198138945f43154fdfd 100644 (file)
@@ -559,7 +559,18 @@ static int cpufreq_get_requested_power(struct thermal_cooling_device *cdev,
        struct cpufreq_cooling_device *cpufreq_device = cdev->devdata;
        u32 *load_cpu = NULL;
 
-       freq = cpufreq_quick_get(cpumask_any(&cpufreq_device->allowed_cpus));
+       cpu = cpumask_any_and(&cpufreq_device->allowed_cpus, cpu_online_mask);
+
+       /*
+        * All the CPUs are offline, thus the requested power by
+        * the cdev is 0
+        */
+       if (cpu >= nr_cpu_ids) {
+               *power = 0;
+               return 0;
+       }
+
+       freq = cpufreq_quick_get(cpu);
 
        if (trace_thermal_power_cpu_get_power_enabled()) {
                u32 ncpus = cpumask_weight(&cpufreq_device->allowed_cpus);