On Mon, Apr 27, 2026 at 02:38:52PM -0700, Jork Loeser wrote: > The SynIC is shared between VMBus and MSHV. VMBus owns the message > page (SIMP), event flags page (SIEFP), global enable (SCONTROL), > and SINT2. MSHV adds SINT0, SINT5, and the event ring page (SIRBP). > > Currently mshv_synic_cpu_init() redundantly enables SIMP, SIEFP, and > SCONTROL that VMBus already configured, and mshv_synic_cpu_exit() > disables all of them. This is wrong because MSHV can be torn down > while VMBus is still active. In particular, a kexec reboot notifier > tears down MSHV first. Disabling SCONTROL, SIMP, and SIEFP out > from under VMBus causes its later cleanup to write SynIC MSRs while > SynIC is disabled, which the hypervisor does not tolerate. > > Restrict MSHV to managing only the resources it owns: > - SINT0, SINT5: mask on cleanup, unmask on init > - SIRBP: enable/disable as before > - SIMP, SIEFP, SCONTROL: leave to VMBus when it is active (L1VH > and nested root partition); on a non-nested root partition VMBus > does not run, so MSHV must enable/disable them > > While here, fix the SIEFP and SIRBP memremap() and virt_to_phys() > calls to use HV_HYP_PAGE_SHIFT/HV_HYP_PAGE_SIZE instead of > PAGE_SHIFT/PAGE_SIZE. The hypervisor always uses 4K pages for SynIC > register GPAs regardless of the kernel page size, so using PAGE_SHIFT > produces wrong addresses on ARM64 with 64K pages. > > Note that initialization order matters - VMBUS first, MSHV second, > and the reverse on de-init. Ideally, we would want a dedicated SYNIC > driver that replaces the cross-dependencies with a clear API and > dynamic tracking. Such refactor should go into its own dedicated > series, outside of this kexec fix series. > > Signed-off-by: Jork Loeser <[email protected]> > --- > drivers/hv/hv.c | 3 + > drivers/hv/mshv_synic.c | 150 ++++++++++++++++++++++++++-------------- > 2 files changed, 103 insertions(+), 50 deletions(-)
Reviewed-by: Anirudh Rayabharam (Microsoft) <[email protected]>

