diff --git a/arch/arm64/kvm/virtcca_cvm.c b/arch/arm64/kvm/virtcca_cvm.c index d881fc757e032d835388c6fbce42781dd0c465b5..5bc7758537e6ba62f316d981e734d4ab00cad612 100644 --- a/arch/arm64/kvm/virtcca_cvm.c +++ b/arch/arm64/kvm/virtcca_cvm.c @@ -734,7 +734,9 @@ static int kvm_activate_cvm(struct kvm *kvm) if (cvm->mig_state->mig_src == VIRTCCA_MIG_DST) { kvm_info("kvm_activate_cvm: vm->mig_state->mig_src == VIRTCCA_MIG_DST"); return 0; - } + } else { + virtcca_mig_export_abort(kvm); + } } if (virtcca_cvm_state(kvm) == CVM_STATE_ACTIVE) { diff --git a/arch/arm64/kvm/virtcca_mig.c b/arch/arm64/kvm/virtcca_mig.c index c48ad6426743a2803f392d5501a8159b8412a41f..edbc23ddb1ccbc58f8ce544a095af6971ffdc996 100644 --- a/arch/arm64/kvm/virtcca_mig.c +++ b/arch/arm64/kvm/virtcca_mig.c @@ -1085,6 +1085,8 @@ static int virtcca_mig_import_end(struct kvm *kvm) } virtcca_mig_state_release(cvm); + cvm->swiotlb_start = 0; + cvm->swiotlb_end = 0; WRITE_ONCE(cvm->state, CVM_STATE_ACTIVE); @@ -1939,7 +1941,16 @@ int virtcca_mig_export_abort(struct kvm *kvm) uint64_t granule; uint64_t ret = 0; - while (target_ipa != 0 && target_ipa < cvm->swiotlb_end) { + ret = tmi_export_abort(cvm->rd); + if (ret) { + pr_err("%s: err=%llx\n", __func__, ret); + return -EIO; + } + + if (target_ipa == 0) + return 0; + + while (target_ipa < cvm->swiotlb_end) { ret = kvm_pgtable_get_leaf(pgt, target_ipa, NULL, &level); if (ret) { pr_err("%s: err=%llx\n", __func__, ret); @@ -1958,12 +1969,9 @@ int virtcca_mig_export_abort(struct kvm *kvm) target_ipa += granule; } - ret = tmi_export_abort(cvm->rd); - if (ret) { - pr_err("%s: err=%llx\n", __func__, ret); - ret = -EIO; - } - virtcca_mig_state_release(cvm); + cvm->swiotlb_start = 0; + cvm->swiotlb_end = 0; + return ret; } \ No newline at end of file