On Mon, Jul 01, 2024 at 01:19:33PM +0200, James Gowans wrote: > From: Marc Zyngier <maz@xxxxxxxxxx> > > Xiang reports that VMs occasionally fail to boot on GICv4.1 systems when > running a preemptible kernel, as it is possible that a vCPU is blocked > without requesting a doorbell interrupt. > > The issue is that any preemption that occurs between vgic_v4_put() and > schedule() on the block path will mark the vPE as nonresident and *not* > request a doorbell irq. This occurs because when the vcpu thread is > resumed on its way to block, vcpu_load() will make the vPE resident > again. Once the vcpu actually blocks, we don't request a doorbell > anymore, and the vcpu won't be woken up on interrupt delivery. > > Fix it by tracking that we're entering WFI, and key the doorbell > request on that flag. This allows us not to make the vPE resident > when going through a preempt/schedule cycle, meaning we don't lose > any state. > > Cc: stable@xxxxxxxxxxxxxxx > Fixes: 8e01d9a396e6 ("KVM: arm64: vgic-v4: Move the GICv4 residency flow to be driven by vcpu_load/put") > Reported-by: Xiang Chen <chenxiang66@xxxxxxxxxxxxx> > Suggested-by: Zenghui Yu <yuzenghui@xxxxxxxxxx> > Tested-by: Xiang Chen <chenxiang66@xxxxxxxxxxxxx> > Co-developed-by: Oliver Upton <oliver.upton@xxxxxxxxx> > Signed-off-by: Marc Zyngier <maz@xxxxxxxxxx> > Acked-by: Zenghui Yu <yuzenghui@xxxxxxxxxx> > Link: https://lore.kernel.org/r/20230713070657.3873244-1-maz@xxxxxxxxxx > Signed-off-by: Oliver Upton <oliver.upton@xxxxxxxxx> > > (cherry picked from commit b321c31c9b7b309dcde5e8854b741c8e6a9a05f0) > > [modified to wrangle the vCPU flags directly instead of going through > the flag helper macros as they have not yet been introduced. Also doing > the flag wranging in the kvm_arch_vcpu_{un}blocking() hooks as the > introduction of kvm_vcpu_wfi has not yet happened. See: > 6109c5a6ab7f ("KVM: arm64: Move vGIC v4 handling for WFI out arch callback hook")] > > Signed-off-by: James Gowans <jgowans@xxxxxxxxxx> > --- > arch/arm64/include/asm/kvm_host.h | 1 + > arch/arm64/kvm/arm.c | 6 ++++-- > arch/arm64/kvm/vgic/vgic-v3.c | 2 +- > arch/arm64/kvm/vgic/vgic-v4.c | 8 ++++++-- > include/kvm/arm_vgic.h | 2 +- > 5 files changed, 13 insertions(+), 6 deletions(-) > All now queued up. greg k-h