x86: fix powernow
authorKeir Fraser <keir.fraser@citrix.com>
Mon, 22 Sep 2008 14:56:12 +0000 (15:56 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Mon, 22 Sep 2008 14:56:12 +0000 (15:56 +0100)
... by allocating the necessary cpufreq_policy structures.

Signed-off-by: Jan Beulich <jbeulich@novell.com>
xen/arch/x86/acpi/cpufreq/powernow.c

index accf120f119720f37070f8483da6c3122f84b836..9d9897be6143d6827c0aed84cac0d099ba63ea14 100644 (file)
@@ -283,9 +283,27 @@ int powernow_cpufreq_init(void)
 
     /* setup cpufreq infrastructure */
     for_each_online_cpu(i) {
-        cpufreq_cpu_policy[i]->cpu = i;
-
-        ret = powernow_cpufreq_cpu_init(cpufreq_cpu_policy[i]);
+        struct cpufreq_policy *policy = cpufreq_cpu_policy[i];
+
+        if (!policy) {
+            unsigned int firstcpu;
+
+            firstcpu = first_cpu(processor_pminfo[i]->perf.shared_cpu_map);
+            if (i == firstcpu) {
+                policy = xmalloc(struct cpufreq_policy);
+                if (!policy) {
+                    ret = -ENOMEM;
+                    goto cpufreq_init_out;
+                }
+                memset(policy, 0, sizeof(struct cpufreq_policy));
+                policy->cpu = i;
+            } else
+                policy = cpufreq_cpu_policy[firstcpu];
+            cpu_set(i, policy->cpus);
+            cpufreq_cpu_policy[i] = policy;
+        }
+
+        ret = powernow_cpufreq_cpu_init(policy);
         if (ret)
             goto cpufreq_init_out;
     }