From: Tian Zheng <zhengtian10@huawei.com> kvm_update_aa64mmfr4_tlbid() calls kvm_set_vm_id_reg() which triggers KVM_BUG_ON when kvm_vm_has_ran_once() is true, causing a kernel panic on vCPU hotplug. The VM-level ID_AA64MMFR4.TLBID is already set during the first vCPU init and doesn't need to be rewritten. Skip kvm_set_vm_id_reg() when the VM has already started. Fixes: 83eec466269a ("KVM: arm64: Expose ID_AA64MMFR4_EL1_TLBID to guest") Signed-off-by: Tian Zheng <zhengtian10@huawei.com> --- arch/arm64/kvm/sys_regs.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c index 86e431d87bd7..4766ece99cba 100644 --- a/arch/arm64/kvm/sys_regs.c +++ b/arch/arm64/kvm/sys_regs.c @@ -3790,6 +3790,17 @@ void kvm_update_aa64mmfr4_tlbid(struct kvm *kvm) mutex_lock(&kvm->arch.config_lock); + if (kvm_vm_has_ran_once(kvm)) { + /* + * ID_AA64MMFR4 is a VM-level register already set during + * the first vCPU init. Skip the write to avoid triggering + * KVM_BUG_ON in kvm_set_vm_id_reg(). The per-vCPU + * vdomain_bitmap is still updated by the caller. + */ + mutex_unlock(&kvm->arch.config_lock); + return; + } + val = kvm_read_vm_id_reg(kvm, SYS_ID_AA64MMFR4_EL1); tlbid_val = read_sanitised_ftr_reg(SYS_ID_AA64MMFR4_EL1); tlbid_val &= ID_AA64MMFR4_EL1_TLBID_MASK; -- 2.33.0