FAILED: patch "[PATCH] KVM: kvmclock: Fix vCPUs > 64 can't be online/hotpluged" failed to apply to 4.19-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 4.19-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From d7eb79c6290c7ae4561418544072e0a3266e7384 Mon Sep 17 00:00:00 2001
From: Wanpeng Li <[email protected]>
Date: Wed, 24 Feb 2021 09:37:29 +0800
Subject: [PATCH] KVM: kvmclock: Fix vCPUs > 64 can't be online/hotpluged
# lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 88 On-line CPU(s) list: 0-63 Off-line CPU(s) list: 64-87
# cat /proc/cmdline BOOT_IMAGE=/vmlinuz-5.10.0-rc3-tlinux2-0050+ root=/dev/mapper/cl-root ro rd.lvm.lv=cl/root rhgb quiet console=ttyS0 LANG=en_US .UTF-8 no-kvmclock-vsyscall
# echo 1 > /sys/devices/system/cpu/cpu76/online -bash: echo: write error: Cannot allocate memory
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.
Message-Id: <[email protected]>
arch/x86/kernel/kvmclock.c +9 -10
@@ -268,21 +268,20 @@ static void __init kvmclock_init_mem(void)static int __init kvm_setup_vsyscall_timeinfo (void ) { -#ifdef CONFIG_X86_64 -u8 flags; +kvmclock_init_mem (); -if (!per_cpu (hv_clock_per_cpu,0 ) || !kvmclock_vsyscall) -return 0 ; +#ifdef CONFIG_X86_64 +if (per_cpu (hv_clock_per_cpu,0 ) && kvmclock_vsyscall) { +u8 flags; - flags =pvclock_read_flags (&hv_clock_boot[0 ].pvti); -if (!(flags &PVCLOCK_TSC_STABLE_BIT )) -return 0 ; + flags =pvclock_read_flags (&hv_clock_boot[0 ].pvti); +if (!(flags &PVCLOCK_TSC_STABLE_BIT )) +return 0 ; - kvm_clock.vdso_clock_mode =VDSO_CLOCKMODE_PVCLOCK ; + kvm_clock.vdso_clock_mode =VDSO_CLOCKMODE_PVCLOCK ; + }#endif -kvmclock_init_mem (); -return 0 ; }early_initcall (kvm_setup_vsyscall_timeinfo);