浏览代码

KVM: arm/arm64: Fix preemptible timer active state crazyness

We were setting the physical active state on the GIC distributor in a
preemptible section, which could cause us to set the active state on
different physical CPU from the one we were actually going to run on,
hacoc ensues.

Since we are no longer descheduling/scheduling soft timers in the
flush/sync timer functions, simply moving the timer flush into a
non-preemptible section.

Reviewed-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>
Christoffer Dall 9 年之前
父节点
当前提交
7e16aa81f9
共有 1 个文件被更改,包括 1 次插入6 次删除
  1. 1 6
      arch/arm/kvm/arm.c

+ 1 - 6
arch/arm/kvm/arm.c

@@ -563,18 +563,13 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)
 		if (vcpu->arch.power_off || vcpu->arch.pause)
 		if (vcpu->arch.power_off || vcpu->arch.pause)
 			vcpu_sleep(vcpu);
 			vcpu_sleep(vcpu);
 
 
-		/*
-		 * Disarming the background timer must be done in a
-		 * preemptible context, as this call may sleep.
-		 */
-		kvm_timer_flush_hwstate(vcpu);
-
 		/*
 		/*
 		 * Preparing the interrupts to be injected also
 		 * Preparing the interrupts to be injected also
 		 * involves poking the GIC, which must be done in a
 		 * involves poking the GIC, which must be done in a
 		 * non-preemptible context.
 		 * non-preemptible context.
 		 */
 		 */
 		preempt_disable();
 		preempt_disable();
+		kvm_timer_flush_hwstate(vcpu);
 		kvm_vgic_flush_hwstate(vcpu);
 		kvm_vgic_flush_hwstate(vcpu);
 
 
 		local_irq_disable();
 		local_irq_disable();