arm/arm64: kvm: Move initialization completion message
authorJulien Thierry <julien.thierry@arm.com>
Fri, 20 Oct 2017 11:34:16 +0000 (12:34 +0100)
committerChristoffer Dall <christoffer.dall@linaro.org>
Sat, 21 Oct 2017 15:03:20 +0000 (17:03 +0200)
KVM is being a bit too optimistic, Hyp mode is said to be initialized
when Hyp segments have only been mapped.

Notify KVM's successful initialization only once it is really fully
initialized.

Signed-off-by: Julien Thierry <julien.thierry@arm.com>
Acked-by: Marc Zyngier <marc.zyngier@arm.com>
Cc: Christoffer Dall <christoffer.dall@linaro.org>
Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>
virt/kvm/arm/arm.c

index b9f68e4..95cba07 100644 (file)
@@ -1326,21 +1326,12 @@ static void teardown_hyp_mode(void)
 {
        int cpu;
 
-       if (is_kernel_in_hyp_mode())
-               return;
-
        free_hyp_pgds();
        for_each_possible_cpu(cpu)
                free_page(per_cpu(kvm_arm_hyp_stack_page, cpu));
        hyp_cpu_pm_exit();
 }
 
-static int init_vhe_mode(void)
-{
-       kvm_info("VHE mode initialized successfully\n");
-       return 0;
-}
-
 /**
  * Inits Hyp-mode on all online CPUs
  */
@@ -1421,8 +1412,6 @@ static int init_hyp_mode(void)
                }
        }
 
-       kvm_info("Hyp mode initialized successfully\n");
-
        return 0;
 
 out_err:
@@ -1456,6 +1445,7 @@ int kvm_arch_init(void *opaque)
 {
        int err;
        int ret, cpu;
+       bool in_hyp_mode;
 
        if (!is_hyp_mode_available()) {
                kvm_err("HYP mode not available\n");
@@ -1474,21 +1464,28 @@ int kvm_arch_init(void *opaque)
        if (err)
                return err;
 
-       if (is_kernel_in_hyp_mode())
-               err = init_vhe_mode();
-       else
+       in_hyp_mode = is_kernel_in_hyp_mode();
+
+       if (!in_hyp_mode) {
                err = init_hyp_mode();
-       if (err)
-               goto out_err;
+               if (err)
+                       goto out_err;
+       }
 
        err = init_subsystems();
        if (err)
                goto out_hyp;
 
+       if (in_hyp_mode)
+               kvm_info("VHE mode initialized successfully\n");
+       else
+               kvm_info("Hyp mode initialized successfully\n");
+
        return 0;
 
 out_hyp:
-       teardown_hyp_mode();
+       if (!in_hyp_mode)
+               teardown_hyp_mode();
 out_err:
        teardown_common_resources();
        return err;