OSDN Git Service

x86/xen: don't let xen_pv_play_dead() return
authorJuergen Gross <jgross@suse.com>
Fri, 25 Nov 2022 06:32:47 +0000 (07:32 +0100)
committerJuergen Gross <jgross@suse.com>
Mon, 13 Feb 2023 05:53:19 +0000 (06:53 +0100)
commit336f560a8917fd60bcdb71b97263257611411453
treeba662f8f2eee6e9dc22f99f1dde34ab7e32dfe7e
parent415dab3c179632d098aadc756b39cebceb977978
x86/xen: don't let xen_pv_play_dead() return

A function called via the paravirt play_dead() hook should not return
to the caller.

xen_pv_play_dead() has a problem in this regard, as it currently will
return in case an offlined cpu is brought to life again. This can be
changed only by doing basically a longjmp() to cpu_bringup_and_idle(),
as the hypercall for bringing down the cpu will just return when the
cpu is coming up again. Just re-initializing the cpu isn't possible,
as the Xen hypervisor will deny that operation.

So introduce xen_cpu_bringup_again() resetting the stack and calling
cpu_bringup_and_idle(), which can be called after HYPERVISOR_vcpu_op()
in xen_pv_play_dead().

Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lore.kernel.org/r/20221125063248.30256-2-jgross@suse.com
Signed-off-by: Juergen Gross <jgross@suse.com>
arch/x86/xen/smp.h
arch/x86/xen/smp_pv.c
arch/x86/xen/xen-head.S