{
        struct kvm_sev_info *dst_sev = &to_kvm_svm(dst_kvm)->sev_info;
        struct kvm_sev_info *src_sev = &to_kvm_svm(src_kvm)->sev_info;
+       int r = -EBUSY;
 
        if (dst_kvm == src_kvm)
                return -EINVAL;
        if (atomic_cmpxchg_acquire(&dst_sev->migration_in_progress, 0, 1))
                return -EBUSY;
 
-       if (atomic_cmpxchg_acquire(&src_sev->migration_in_progress, 0, 1)) {
-               atomic_set_release(&dst_sev->migration_in_progress, 0);
-               return -EBUSY;
-       }
+       if (atomic_cmpxchg_acquire(&src_sev->migration_in_progress, 0, 1))
+               goto release_dst;
 
-       mutex_lock(&dst_kvm->lock);
-       mutex_lock(&src_kvm->lock);
+       r = -EINTR;
+       if (mutex_lock_killable(&dst_kvm->lock))
+               goto release_src;
+       if (mutex_lock_killable(&src_kvm->lock))
+               goto unlock_dst;
        return 0;
+
+unlock_dst:
+       mutex_unlock(&dst_kvm->lock);
+release_src:
+       atomic_set_release(&src_sev->migration_in_progress, 0);
+release_dst:
+       atomic_set_release(&dst_sev->migration_in_progress, 0);
+       return r;
 }
 
 static void sev_unlock_two_vms(struct kvm *dst_kvm, struct kvm *src_kvm)