Message ID | 1614130683-24137-1-git-send-email-wanpengli@tencent.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v4] KVM: kvmclock: Fix vCPUs > 64 can't be online/hotpluged | expand |
ping, :) On Wed, 24 Feb 2021 at 09:38, Wanpeng Li <kernellwp@gmail.com> wrote: > > From: Wanpeng Li <wanpengli@tencent.com> > > # 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. > > Fixes: 6a1cac56f4 ("x86/kvm: Use __bss_decrypted attribute in shared variables") > Reported-by: Zelin Deng <zelin.deng@linux.alibaba.com> > Cc: Brijesh Singh <brijesh.singh@amd.com> > Cc: stable@vger.kernel.org#v4.19-rc5+ > Signed-off-by: Wanpeng Li <wanpengli@tencent.com> > --- > v3 -> v4: > * fix kernel test robot report WARNING > v2 -> v3: > * allocate dynamically memory unconditionally > v1 -> v2: > * add code comments > > arch/x86/kernel/kvmclock.c | 19 +++++++++---------- > 1 file changed, 9 insertions(+), 10 deletions(-) > > diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c > index aa59374..1fc0962 100644 > --- a/arch/x86/kernel/kvmclock.c > +++ b/arch/x86/kernel/kvmclock.c > @@ -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); > -- > 2.7.4 >
On 24/02/21 02:37, Wanpeng Li wrote: > From: Wanpeng Li <wanpengli@tencent.com> > > # 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. > > Fixes: 6a1cac56f4 ("x86/kvm: Use __bss_decrypted attribute in shared variables") > Reported-by: Zelin Deng <zelin.deng@linux.alibaba.com> > Cc: Brijesh Singh <brijesh.singh@amd.com> > Cc: stable@vger.kernel.org#v4.19-rc5+ > Signed-off-by: Wanpeng Li <wanpengli@tencent.com> > --- > v3 -> v4: > * fix kernel test robot report WARNING > v2 -> v3: > * allocate dynamically memory unconditionally > v1 -> v2: > * add code comments > > arch/x86/kernel/kvmclock.c | 19 +++++++++---------- > 1 file changed, 9 insertions(+), 10 deletions(-) > > diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c > index aa59374..1fc0962 100644 > --- a/arch/x86/kernel/kvmclock.c > +++ b/arch/x86/kernel/kvmclock.c > @@ -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); > Queued, thanks. Paolo
diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c index aa59374..1fc0962 100644 --- a/arch/x86/kernel/kvmclock.c +++ b/arch/x86/kernel/kvmclock.c @@ -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);