From: Wanpeng Li <wanpengli@xxxxxxxxxxx> The per-cpu vsyscall pvclock data pointer assigns either an element of the static array hv_clock_boot (#vCPU <= 64) or dynamically allocated memory hvclock_mem (vCPU > 64), the dynamically memory will not be allocated if kvmclock vsyscall is disabled, this can result in cpu hotpluged fails in kvmclock_setup_percpu() which returns -ENOMEM. It's broken for no-vsyscall and sometimes you end up with vsyscall disabled if the host does something strange. This patch fixes it by allocating this dynamically memory unconditionally even if vsyscall is disabled. Fixes: 6a1cac56f4 ("x86/kvm: Use __bss_decrypted attribute in shared variables") Reported-by: Zelin Deng <zelin.deng@xxxxxxxxxxxxxxxxx> Tested-by: Haiwei Li <lihaiwei@xxxxxxxxxxx> Cc: Brijesh Singh <brijesh.singh@xxxxxxx> Cc: stable@xxxxxxxxxxxxxxx#v4.19-rc5+ Signed-off-by: Wanpeng Li <wanpengli@xxxxxxxxxxx> --- v2 -> v3: * allocate dynamically memory unconditionally v1 -> v2: * add code comments arch/x86/kernel/kvmclock.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c index aa59374..a72b16e 100644 --- a/arch/x86/kernel/kvmclock.c +++ b/arch/x86/kernel/kvmclock.c @@ -268,6 +268,8 @@ static void __init kvmclock_init_mem(void) static int __init kvm_setup_vsyscall_timeinfo(void) { + kvmclock_init_mem(); + #ifdef CONFIG_X86_64 u8 flags; @@ -281,8 +283,6 @@ static int __init kvm_setup_vsyscall_timeinfo(void) kvm_clock.vdso_clock_mode = VDSO_CLOCKMODE_PVCLOCK; #endif - kvmclock_init_mem(); - return 0; } early_initcall(kvm_setup_vsyscall_timeinfo); -- 2.7.4