From df144d07c87a0f1d87d10c6239a7b37dec225336 Mon Sep 17 00:00:00 2001 From: panhengchang Date: Sun, 21 Dec 2025 16:36:53 +0800 Subject: [PATCH] fix abort when libvirt stop migration --- arch/arm64/kvm/virtcca_cvm.c | 4 +++- arch/arm64/kvm/virtcca_mig.c | 22 +++++++++++++++------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/arch/arm64/kvm/virtcca_cvm.c b/arch/arm64/kvm/virtcca_cvm.c index d881fc757e03..5bc7758537e6 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 c48ad6426743..edbc23ddb1cc 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 -- Gitee