Re: [PATCH v16 17/45] KVM: arm64: CCA: Tear down RTTs

Suzuki K Poulose <[email protected]> Tue, 4 Aug 2026 13:16:00 +0100
Newsgroups dev.linux.lists.kvmarm,dev.linux.lists.linux-coco,org.infradead.lists.linux-arm-kernel,org.kernel.vger.kvm,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
Hi there

On 03/08/2026 23:29, Alper Gun wrote:
> On Mon, Aug 3, 2026 at 6:45 AM Steven Price <[email protected]> wrote:
>> [...]
>> +static void realm_unmap_stage2(struct kvm *kvm)
>> +{
>> +       struct realm *realm = &kvm->arch.realm;
>> +
>> +       lockdep_assert_held(&kvm->arch.config_lock);
>> +
>> +       if (realm->stage2_unmapped)
>> +               return;
>> +
>> +       write_lock(&kvm->mmu_lock);
>> +       kvm_stage2_unmap_range(&kvm->arch.mmu, 0,
>> +                              BIT(realm->ia_bits - 1), true);
>> +       write_unlock(&kvm->mmu_lock);
>> +
>> +       realm->stage2_unmapped = true;
>> +}
>> +
>> +int kvm_realm_teardown_stage2(struct kvm *kvm)
>> +{
>> +       lockdep_assert_held(&kvm->arch.config_lock);
>> +
>> +       realm_unmap_stage2(kvm);
>> +       return realm_destroy_rtts(kvm);
>> +}
> 
> Hi Steven,
> 
> I noticed a warning in dmesg when destroying a realm:
> 
>    [  158.533495] Call trace:
>    [  158.535927]  kvm_destroy_realm+0x208/0x218
>    [  158.540356]  kvm_arch_destroy_vm+0xc8/0xd8
>    [  158.544439]  kvm_put_kvm+0x324/0x4b0
>    [  158.548002]  kvm_vm_stats_release+0x1c/0x38

Thanks for the report and the detailed analysis.

> 
> I traced this and found the following:
> 
> At this point, calling realm_destroy_rtts() may fail destroying the RTTs
> because RECs are still active and the Realm is not terminated, but the
> walk finishes and still sets realm->rtts_destroyed = true.
> 
> Later, kvm_destroy_realm() calls rmi_realm_terminate() and then calls
> realm_destroy_rtts(kvm) again. But because realm->rtts_destroyed is already
> set to true, it exits early without tearing down the RTTs.
> 
> Consequently, rmi_realm_destroy() is invoked while the RTT tables still
> exist in RMM, which fails and triggers WARN_ON(rmi_realm_destroy).
> 
> The fix I used was to remove realm_destroy_rtts() from
> kvm_realm_teardown_stage2():
> --- a/arch/arm64/kvm/rmi.c
> +++ b/arch/arm64/kvm/rmi.c
> @@ -434,7 +434,7 @@ int kvm_realm_teardown_stage2(struct kvm *kvm)
>    lockdep_assert_held(&kvm->arch.config_lock);
> 
>    realm_unmap_stage2(kvm);
> - return realm_destroy_rtts(kvm);
> + return 0;
>   }
> 
> I think we don't need RTT destruction here as it will be handled cleanly in
> kvm_destroy_realm() later.

That sounds sensible to me, I will take a look and fix it locally for 
the next version.


Thanks
Suzuki

> 
> Thanks,
> Alper