ARM: KVM: iterate over all CPUs for CPU compatibility check
authorAndre Przywara <andre.przywara@linaro.org>
Wed, 17 Apr 2013 10:52:01 +0000 (12:52 +0200)
committerChristoffer Dall <cdall@cs.columbia.edu>
Mon, 29 Apr 2013 05:23:23 +0000 (22:23 -0700)
kvm_target_cpus() checks the compatibility of the used CPU with
KVM, which is currently limited to ARM Cortex-A15 cores.
However by calling it only once on any random CPU it assumes that
all cores are the same, which is not necessarily the case (for example
in Big.Little).

[ I cut some of the commit message and changed the formatting of the
  code slightly to pass checkpatch and look more like the rest of the
  kvm/arm init code - Christoffer ]

Signed-off-by: Andre Przywara <andre.przywara@linaro.org>
Signed-off-by: Christoffer Dall <cdall@cs.columbia.edu>
arch/arm/kvm/arm.c

index 089c0a40514caeb50b12a345de62d6d48e5e834c..5bc99b452b045bfbfc75b75d9677ffbc9c6eee53 100644 (file)
@@ -947,21 +947,30 @@ out_err:
        return err;
 }
 
+static void check_kvm_target_cpu(void *ret)
+{
+       *(int *)ret = kvm_target_cpu();
+}
+
 /**
  * Initialize Hyp-mode and memory mappings on all CPUs.
  */
 int kvm_arch_init(void *opaque)
 {
        int err;
+       int ret, cpu;
 
        if (!is_hyp_mode_available()) {
                kvm_err("HYP mode not available\n");
                return -ENODEV;
        }
 
-       if (kvm_target_cpu() < 0) {
-               kvm_err("Target CPU not supported!\n");
-               return -ENODEV;
+       for_each_online_cpu(cpu) {
+               smp_call_function_single(cpu, check_kvm_target_cpu, &ret, 1);
+               if (ret < 0) {
+                       kvm_err("Error, CPU %d not supported!\n", cpu);
+                       return -ENODEV;
+               }
        }
 
        err = init_hyp_mode();