diff --git a/arch/arm64/kvm/arch_timer.c b/arch/arm64/kvm/arch_timer.c index 807873a72f89df912fa3b1e18401f3a83135cfdc..42eeec7b94546269807a3dba25640ccfa5f44997 100644 --- a/arch/arm64/kvm/arch_timer.c +++ b/arch/arm64/kvm/arch_timer.c @@ -309,6 +309,14 @@ static void soft_timer_cancel(struct hrtimer *hrt) hrtimer_cancel(hrt); } +static inline void set_timer_irq_phys_active(struct arch_timer_context *ctx, bool active) +{ + int r; + + r = irq_set_irqchip_state(ctx->host_timer_irq, IRQCHIP_STATE_ACTIVE, active); + WARN_ON(r); +} + static irqreturn_t kvm_arch_timer_handler(int irq, void *dev_id) { struct kvm_vcpu *vcpu = *(struct kvm_vcpu **)dev_id; @@ -333,6 +341,8 @@ static irqreturn_t kvm_arch_timer_handler(int irq, void *dev_id) if (kvm_timer_should_fire(ctx)) kvm_timer_update_irq(vcpu, true, ctx); + else + set_timer_irq_phys_active(ctx, false); if (userspace_irqchip(vcpu->kvm) && !static_branch_unlikely(&has_gic_active_state)) @@ -747,13 +757,6 @@ static void timer_restore_state(struct arch_timer_context *ctx) local_irq_restore(flags); } -static inline void set_timer_irq_phys_active(struct arch_timer_context *ctx, bool active) -{ - int r; - r = irq_set_irqchip_state(ctx->host_timer_irq, IRQCHIP_STATE_ACTIVE, active); - WARN_ON(r); -} - #ifdef CONFIG_VIRT_VTIMER_IRQ_BYPASS static void kvm_vtimer_mbigen_auto_clr_set(struct kvm_vcpu *vcpu, bool set) {