The GICv5 VPE doorbells are used to notify KVM that a non-resident VPE has an interrupt to handle. We use the db_fired flag to track this, and therefore need to ensure that the flag is cleared once it has been consumed. Explicitly set the db_fired flag to false before making a VPE non-resident as any state is stale at this stage. This also ensures that any incoming doorbells, if requested, will be observed. Signed-off-by: Sascha Bischoff --- arch/arm64/kvm/hyp/vgic-v5-sr.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/arch/arm64/kvm/hyp/vgic-v5-sr.c b/arch/arm64/kvm/hyp/vgic-v5-sr.c index 04c5846b9abac..d27fe2911df3f 100644 --- a/arch/arm64/kvm/hyp/vgic-v5-sr.c +++ b/arch/arm64/kvm/hyp/vgic-v5-sr.c @@ -22,6 +22,15 @@ void __vgic_v5_make_resident(struct vgic_v5_cpu_if *cpu_if) void __vgic_v5_make_non_resident(struct vgic_v5_cpu_if *cpu_if) { + /* + * Clear the db_fired state to ensure that we're ready for the next + * doorbell when it is requested. If a doorbell firing caused us to + * enter the guest, then we've already consumed that state at this + * point, so this is safe to clear. Use WRITE_ONCE() to ensure we're not + * racing with the doorbell firing and setting the state true again. + */ + WRITE_ONCE(cpu_if->gicv5_vpe.db_fired, false); + /* * Make as non-resident before actually making non-resident. Avoids race * with doorbell arriving. -- 2.34.1