Merge tag 'linux-watchdog-5.15-rc1' of git://www.linux-watchdog.org/linux-watchdog
[linux-2.6-microblaze.git] / arch / arm64 / kvm / reset.c
index 08fd487..5ce36b0 100644 (file)
@@ -210,10 +210,16 @@ static bool vcpu_allowed_register_width(struct kvm_vcpu *vcpu)
  */
 int kvm_reset_vcpu(struct kvm_vcpu *vcpu)
 {
+       struct vcpu_reset_state reset_state;
        int ret;
        bool loaded;
        u32 pstate;
 
+       mutex_lock(&vcpu->kvm->lock);
+       reset_state = vcpu->arch.reset_state;
+       WRITE_ONCE(vcpu->arch.reset_state.reset, false);
+       mutex_unlock(&vcpu->kvm->lock);
+
        /* Reset PMU outside of the non-preemptible section */
        kvm_pmu_vcpu_reset(vcpu);
 
@@ -276,8 +282,8 @@ int kvm_reset_vcpu(struct kvm_vcpu *vcpu)
         * Additional reset state handling that PSCI may have imposed on us.
         * Must be done after all the sys_reg reset.
         */
-       if (vcpu->arch.reset_state.reset) {
-               unsigned long target_pc = vcpu->arch.reset_state.pc;
+       if (reset_state.reset) {
+               unsigned long target_pc = reset_state.pc;
 
                /* Gracefully handle Thumb2 entry point */
                if (vcpu_mode_is_32bit(vcpu) && (target_pc & 1)) {
@@ -286,13 +292,11 @@ int kvm_reset_vcpu(struct kvm_vcpu *vcpu)
                }
 
                /* Propagate caller endianness */
-               if (vcpu->arch.reset_state.be)
+               if (reset_state.be)
                        kvm_vcpu_set_be(vcpu);
 
                *vcpu_pc(vcpu) = target_pc;
-               vcpu_set_reg(vcpu, 0, vcpu->arch.reset_state.r0);
-
-               vcpu->arch.reset_state.reset = false;
+               vcpu_set_reg(vcpu, 0, reset_state.r0);
        }
 
        /* Reset timer */