arm64: KVM: Invoke compute_layout() before alternatives are applied
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>
This commit is contained in:
parent
df325e05a6
commit
0492747c72
@ -91,6 +91,7 @@ alternative_cb_end
|
|||||||
|
|
||||||
void kvm_update_va_mask(struct alt_instr *alt,
|
void kvm_update_va_mask(struct alt_instr *alt,
|
||||||
__le32 *origptr, __le32 *updptr, int nr_inst);
|
__le32 *origptr, __le32 *updptr, int nr_inst);
|
||||||
|
void kvm_compute_layout(void);
|
||||||
|
|
||||||
static inline unsigned long __kern_hyp_va(unsigned long v)
|
static inline unsigned long __kern_hyp_va(unsigned long v)
|
||||||
{
|
{
|
||||||
|
@ -31,6 +31,7 @@
|
|||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
#include <linux/irq_work.h>
|
#include <linux/irq_work.h>
|
||||||
#include <linux/kexec.h>
|
#include <linux/kexec.h>
|
||||||
|
#include <linux/kvm_host.h>
|
||||||
|
|
||||||
#include <asm/alternative.h>
|
#include <asm/alternative.h>
|
||||||
#include <asm/atomic.h>
|
#include <asm/atomic.h>
|
||||||
@ -39,6 +40,7 @@
|
|||||||
#include <asm/cputype.h>
|
#include <asm/cputype.h>
|
||||||
#include <asm/cpu_ops.h>
|
#include <asm/cpu_ops.h>
|
||||||
#include <asm/daifflags.h>
|
#include <asm/daifflags.h>
|
||||||
|
#include <asm/kvm_mmu.h>
|
||||||
#include <asm/mmu_context.h>
|
#include <asm/mmu_context.h>
|
||||||
#include <asm/numa.h>
|
#include <asm/numa.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
@ -408,6 +410,8 @@ static void __init hyp_mode_check(void)
|
|||||||
"CPU: CPUs started in inconsistent modes");
|
"CPU: CPUs started in inconsistent modes");
|
||||||
else
|
else
|
||||||
pr_info("CPU: All CPU(s) started at EL1\n");
|
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)
|
void __init smp_cpus_done(unsigned int max_cpus)
|
||||||
|
@ -22,7 +22,7 @@ static u8 tag_lsb;
|
|||||||
static u64 tag_val;
|
static u64 tag_val;
|
||||||
static u64 va_mask;
|
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);
|
phys_addr_t idmap_addr = __pa_symbol(__hyp_idmap_text_start);
|
||||||
u64 hyp_va_msb;
|
u64 hyp_va_msb;
|
||||||
@ -110,9 +110,6 @@ void __init kvm_update_va_mask(struct alt_instr *alt,
|
|||||||
|
|
||||||
BUG_ON(nr_inst != 5);
|
BUG_ON(nr_inst != 5);
|
||||||
|
|
||||||
if (!has_vhe() && !va_mask)
|
|
||||||
compute_layout();
|
|
||||||
|
|
||||||
for (i = 0; i < nr_inst; i++) {
|
for (i = 0; i < nr_inst; i++) {
|
||||||
u32 rd, rn, insn, oinsn;
|
u32 rd, rn, insn, oinsn;
|
||||||
|
|
||||||
@ -156,9 +153,6 @@ void kvm_patch_vector_branch(struct alt_instr *alt,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!va_mask)
|
|
||||||
compute_layout();
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Compute HYP VA by using the same computation as kern_hyp_va()
|
* Compute HYP VA by using the same computation as kern_hyp_va()
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user