android_kernel_xiaomi_sm7250/arch/x86/xen
Dongli Zhang 0848767dee xen: delay xen_hvm_init_time_ops() if kdump is boot on vcpu>=32
[ Upstream commit eed05744322da07dd7e419432dcedf3c2e017179 ]

The sched_clock() can be used very early since commit 857baa87b6
("sched/clock: Enable sched clock early"). In addition, with commit
38669ba205 ("x86/xen/time: Output xen sched_clock time from 0"), kdump
kernel in Xen HVM guest may panic at very early stage when accessing
&__this_cpu_read(xen_vcpu)->time as in below:

setup_arch()
 -> init_hypervisor_platform()
     -> x86_init.hyper.init_platform = xen_hvm_guest_init()
         -> xen_hvm_init_time_ops()
             -> xen_clocksource_read()
                 -> src = &__this_cpu_read(xen_vcpu)->time;

This is because Xen HVM supports at most MAX_VIRT_CPUS=32 'vcpu_info'
embedded inside 'shared_info' during early stage until xen_vcpu_setup() is
used to allocate/relocate 'vcpu_info' for boot cpu at arbitrary address.

However, when Xen HVM guest panic on vcpu >= 32, since
xen_vcpu_info_reset(0) would set per_cpu(xen_vcpu, cpu) = NULL when
vcpu >= 32, xen_clocksource_read() on vcpu >= 32 would panic.

This patch calls xen_hvm_init_time_ops() again later in
xen_hvm_smp_prepare_boot_cpu() after the 'vcpu_info' for boot vcpu is
registered when the boot vcpu is >= 32.

This issue can be reproduced on purpose via below command at the guest
side when kdump/kexec is enabled:

"taskset -c 33 echo c > /proc/sysrq-trigger"

The bugfix for PVM is not implemented due to the lack of testing
environment.

[boris: xen_hvm_init_time_ops() returns on errors instead of jumping to end]

Cc: Joe Jin <joe.jin@oracle.com>
Signed-off-by: Dongli Zhang <dongli.zhang@oracle.com>
Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Link: https://lore.kernel.org/r/20220302164032.14569-3-dongli.zhang@oracle.com
Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2022-04-15 14:15:03 +02:00
..
apic.c
debugfs.c
debugfs.h
efi.c
enlighten_hvm.c
enlighten_pv.c xen/x86: fix PV trap handling on secondary processors 2021-10-06 15:31:10 +02:00
enlighten_pvh.c
enlighten.c
grant-table.c
irq.c
Kconfig
Makefile
mmu_hvm.c
mmu_pv.c
mmu.c
mmu.h
multicalls.c
multicalls.h
p2m.c
pci-swiotlb-xen.c
platform-pci-unplug.c
pmu.c xen: fix is_xen_pmu() 2022-04-15 14:14:53 +02:00
pmu.h xen: fix is_xen_pmu() 2022-04-15 14:14:53 +02:00
setup.c
smp_hvm.c xen: delay xen_hvm_init_time_ops() if kdump is boot on vcpu>=32 2022-04-15 14:15:03 +02:00
smp_pv.c xen: fix is_xen_pmu() 2022-04-15 14:14:53 +02:00
smp.c
smp.h
spinlock.c
suspend_hvm.c
suspend_pv.c
suspend.c
time.c xen: delay xen_hvm_init_time_ops() if kdump is boot on vcpu>=32 2022-04-15 14:15:03 +02:00
trace.c
vdso.h
vga.c
xen-asm_32.S
xen-asm_64.S
xen-asm.S
xen-head.S
xen-ops.h
xen-pvh.S