{
        struct vcpu_vmx *vmx = to_vmx(vcpu);
 
-       if (evmptr_is_valid(vmx->nested.hv_evmcs_vmptr)) {
+       if (evmptr_is_valid(vmx->nested.hv_evmcs_vmptr))
                copy_vmcs12_to_enlightened(vmx);
-               /* All fields are clean */
-               vmx->nested.hv_evmcs->hv_clean_fields |=
-                       HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL;
-       } else {
+       else
                copy_vmcs12_to_shadow(vmx);
-       }
 
        vmx->nested.need_vmcs12_to_shadow_sync = false;
 }
 
        kvm_rsp_write(vcpu, vmcs12->guest_rsp);
        kvm_rip_write(vcpu, vmcs12->guest_rip);
+
+       /*
+        * It was observed that genuine Hyper-V running in L1 doesn't reset
+        * 'hv_clean_fields' by itself, it only sets the corresponding dirty
+        * bits when it changes a field in eVMCS. Mark all fields as clean
+        * here.
+        */
+       if (evmptr_is_valid(vmx->nested.hv_evmcs_vmptr))
+               vmx->nested.hv_evmcs->hv_clean_fields |=
+                       HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL;
+
        return 0;
 }