]> git.baikalelectronics.ru Git - kernel.git/commitdiff
arm64: KVM: Invoke compute_layout() before alternatives are applied
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>
Thu, 28 Nov 2019 19:58:05 +0000 (20:58 +0100)
committerCatalin Marinas <catalin.marinas@arm.com>
Fri, 6 Dec 2019 12:14:45 +0000 (12:14 +0000)
compute_layout() is invoked as part of an alternative fixup under
stop_machine(). This function invokes get_random_long() which acquires a
sleeping lock on -RT which can not be acquired in this context.

Rename compute_layout() to kvm_compute_layout() and invoke it before
stop_machine() applies the alternatives. Add a __init prefix to
kvm_compute_layout() because the caller has it, too (and so the code can be
discarded after boot).

Reviewed-by: James Morse <james.morse@arm.com>
Acked-by: Marc Zyngier <maz@kernel.org>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
arch/arm64/include/asm/kvm_mmu.h
arch/arm64/kernel/smp.c
arch/arm64/kvm/va_layout.c

index befe37d4bc0e5c3990fa76042236671e20040567..53d846f1bfe70497b81d2457c9a6eefe543fc61f 100644 (file)
@@ -91,6 +91,7 @@ alternative_cb_end
 
 void kvm_update_va_mask(struct alt_instr *alt,
                        __le32 *origptr, __le32 *updptr, int nr_inst);
+void kvm_compute_layout(void);
 
 static inline unsigned long __kern_hyp_va(unsigned long v)
 {
index dc9fe879c27932ef413dc99df73f39994855f052..02d41eae3da86c7f4d55e4bcc34f8dbc58fd2bc4 100644 (file)
@@ -31,6 +31,7 @@
 #include <linux/of.h>
 #include <linux/irq_work.h>
 #include <linux/kexec.h>
+#include <linux/kvm_host.h>
 
 #include <asm/alternative.h>
 #include <asm/atomic.h>
@@ -39,6 +40,7 @@
 #include <asm/cputype.h>
 #include <asm/cpu_ops.h>
 #include <asm/daifflags.h>
+#include <asm/kvm_mmu.h>
 #include <asm/mmu_context.h>
 #include <asm/numa.h>
 #include <asm/pgtable.h>
@@ -408,6 +410,8 @@ static void __init hyp_mode_check(void)
                           "CPU: CPUs started in inconsistent modes");
        else
                pr_info("CPU: All CPU(s) started at EL1\n");
+       if (IS_ENABLED(CONFIG_KVM_ARM_HOST))
+               kvm_compute_layout();
 }
 
 void __init smp_cpus_done(unsigned int max_cpus)
index 2cf7d4b606c38d1f32e9772bc08716bd331950b8..dab1fea4752aaf3837649d03e16a3cfaf1f91e8e 100644 (file)
@@ -22,7 +22,7 @@ static u8 tag_lsb;
 static u64 tag_val;
 static u64 va_mask;
 
-static void compute_layout(void)
+__init void kvm_compute_layout(void)
 {
        phys_addr_t idmap_addr = __pa_symbol(__hyp_idmap_text_start);
        u64 hyp_va_msb;
@@ -110,9 +110,6 @@ void __init kvm_update_va_mask(struct alt_instr *alt,
 
        BUG_ON(nr_inst != 5);
 
-       if (!has_vhe() && !va_mask)
-               compute_layout();
-
        for (i = 0; i < nr_inst; i++) {
                u32 rd, rn, insn, oinsn;
 
@@ -156,9 +153,6 @@ void kvm_patch_vector_branch(struct alt_instr *alt,
                return;
        }
 
-       if (!va_mask)
-               compute_layout();
-
        /*
         * Compute HYP VA by using the same computation as kern_hyp_va()
         */