From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail.loongson.cn (mail.loongson.cn [114.242.206.163]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 7CD482D8385; Mon, 3 Aug 2026 01:21:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=114.242.206.163 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785720071; cv=none; b=Kt2x5GD/lsTrJFTrDhLjmbAKoSZ9a9Je7b+N4qV3+LbEfoz5YMLjF2mEve0yJ7nJKHg2lr64ZeVVUqUfhJiJY/aWhU+dKOPbKczNG2hjY4DR26joFLiScdo7wrlSuRjvVDivGz9NaVIkgbQbQIjCS9ixtBqmrd3hocqwHeCRkzA= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785720071; c=relaxed/simple; bh=CAxFFZikT7uqteiXljmpjLG73rgz6Xpa4WRqsDC/C+Q=; h=Subject:To:Cc:References:From:Message-ID:Date:MIME-Version: In-Reply-To:Content-Type; b=VQu4OS5Uqd3V1YGfGpCl6M8VVOm0u3Gjbk5vs6MJ28G1oqAiy9wzvxxTRtGVoHFHGjE1Zv50dVRVlbIZse3rPLSh0LmNllgswEnxXm6d6rjn7EqObN3mJFzjT53CAzHJhv2muMj+xYmv6sBT0SV8OoFkkTPsyvT/JBghCQgJzaQ= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=loongson.cn; spf=pass smtp.mailfrom=loongson.cn; arc=none smtp.client-ip=114.242.206.163 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=loongson.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=loongson.cn Received: from loongson.cn (unknown [10.20.42.62]) by gateway (Coremail) with SMTP id _____8CxzKH97G9qqsMJAA--.9053S3; Mon, 03 Aug 2026 09:21:01 +0800 (CST) Received: from [10.20.42.62] (unknown [10.20.42.62]) by front1 (Coremail) with SMTP id qMiowJDxPcX57G9qoZMhAA--.49859S2; Mon, 03 Aug 2026 09:20:59 +0800 (CST) Subject: Re: [PATCH 1/6] LoongArch: KVM: Add vmid support for stage2 MMU To: Huacai Chen Cc: Sean Christopherson , Paolo Bonzini , WANG Xuerui , Arnd Bergmann , Xi Ruoyao , kvm@vger.kernel.org, loongarch@lists.linux.dev, linux-kernel@vger.kernel.org References: <20260727072109.2151675-1-maobibo@loongson.cn> <20260727072109.2151675-2-maobibo@loongson.cn> From: Bibo Mao Message-ID: Date: Mon, 3 Aug 2026 09:20:42 +0800 User-Agent: Mozilla/5.0 (X11; Linux loongarch64; rv:68.0) Gecko/20100101 Thunderbird/68.7.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit X-CM-TRANSID:qMiowJDxPcX57G9qoZMhAA--.49859S2 X-CM-SenderInfo: xpdruxter6z05rqj20fqof0/ X-Coremail-Antispam: 1Uk129KBj93XoWxZF43GF45CF47uF47Xr1UJwc_yoWrCw4kpF 9rAF4kWr40grykCa4qq3s5Wr45X3ykKw1aga1SyFyFyr12vr18ArykCryDuFy5Jw4rAF4I vF95K3ZFvF4Dt3cCm3ZEXasCq-sJn29KB7ZKAUJUUUU7529EdanIXcx71UUUUU7KY7ZEXa sCq-sGcSsGvfJ3Ic02F40EFcxC0VAKzVAqx4xG6I80ebIjqfuFe4nvWSU5nxnvy29KBjDU 0xBIdaVrnRJUUUBjb4IE77IF4wAFF20E14v26r1j6r4UM7CY07I20VC2zVCF04k26cxKx2 IYs7xG6rWj6s0DM7CIcVAFz4kK6r1Y6r17M28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48v e4kI8wA2z4x0Y4vE2Ix0cI8IcVAFwI0_Jr0_JF4l84ACjcxK6xIIjxv20xvEc7CjxVAFwI 0_Jr0_Gr1l84ACjcxK6I8E87Iv67AKxVW8JVWxJwA2z4x0Y4vEx4A2jsIEc7CjxVAFwI0_ Gr0_Gr1UM2kKe7AKxVWUXVWUAwAS0I0E0xvYzxvE52x082IY62kv0487Mc804VCY07AIYI kI8VC2zVCFFI0UMc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7IYx2IY67AKxVWUAVWU twAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4UM4x0Y48IcVAKI48JMx k0xIA0c2IEe2xFo4CEbIxvr21l42xK82IYc2Ij64vIr41l4I8I3I0E4IkC6x0Yz7v_Jr0_ Gr1l4IxYO2xFxVAFwI0_Jrv_JF1lx2IqxVAqx4xG67AKxVWUJVWUGwC20s026x8GjcxK67 AKxVWUGVWUWwC2zVAF1VAY17CE14v26r1q6r43MIIYrxkI7VAKI48JMIIF0xvE2Ix0cI8I cVAFwI0_Jr0_JF4lIxAIcVC0I7IYx2IY6xkF7I0E14v26r1j6r4UMIIF0xvE42xK8VAvwI 8IcIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxVWUJVW8JwCI42IY6I8E87Iv6xkF7I0E14v2 6r1j6r4UYxBIdaVFxhVjvjDU0xZFpf9x07j5xhLUUUUU= On 2026/8/2 下午10:11, Huacai Chen wrote: > Hi, Bibo, > > On Mon, Jul 27, 2026 at 3:29 PM Bibo Mao wrote: >> >> LoongArch KVM hypervisor supports two-level MMU, vpid index is used >> for stage1 MMU and vmid index is used for stage2 MMU. >> >> On 3A5000, vmid must be the same with vpid. On 3A6000 platform vmid >> may separate from vpid. If vcpu migrate to different physical CPUs, >> vpid need change however vmid can keep the same with old value. Also >> vmid index of the while VM machine on physical CPU the same, all vCPUs >> on the VM can share the same vmid index on one physical CPU. >> >> Here vmid index is added and it keeps the same with vpid still. >> >> Signed-off-by: Bibo Mao >> --- >> arch/loongarch/include/asm/kvm_host.h | 3 +++ >> arch/loongarch/kernel/asm-offsets.c | 1 + >> arch/loongarch/kvm/main.c | 1 + >> arch/loongarch/kvm/switch.S | 5 ++--- >> arch/loongarch/kvm/tlb.c | 5 ++++- >> 5 files changed, 11 insertions(+), 4 deletions(-) >> >> diff --git a/arch/loongarch/include/asm/kvm_host.h b/arch/loongarch/include/asm/kvm_host.h >> index 23cfbecebbd7..ec7b0c402385 100644 >> --- a/arch/loongarch/include/asm/kvm_host.h >> +++ b/arch/loongarch/include/asm/kvm_host.h >> @@ -189,6 +189,9 @@ struct kvm_vcpu_arch { >> unsigned long host_tp; >> unsigned long host_pgd; >> >> + /* vmid info for guest VM */ >> + unsigned long vmid; > Put it near vpid? yes, it it better to near vpid. will do this. > >> + >> /* Host CSRs are used when handling exits from guest */ >> unsigned long badi; >> unsigned long badv; >> diff --git a/arch/loongarch/kernel/asm-offsets.c b/arch/loongarch/kernel/asm-offsets.c >> index 1b861cbc5e10..32ef6adfc8dd 100644 >> --- a/arch/loongarch/kernel/asm-offsets.c >> +++ b/arch/loongarch/kernel/asm-offsets.c >> @@ -300,6 +300,7 @@ static void __used output_kvm_defines(void) >> OFFSET(KVM_ARCH_HSP, kvm_vcpu_arch, host_sp); >> OFFSET(KVM_ARCH_HTP, kvm_vcpu_arch, host_tp); >> OFFSET(KVM_ARCH_HPGD, kvm_vcpu_arch, host_pgd); >> + OFFSET(KVM_ARCH_VMID, kvm_vcpu_arch, vmid); >> OFFSET(KVM_ARCH_KVMPGD, kvm_vcpu_arch, kvm_pgd); >> OFFSET(KVM_ARCH_HANDLE_EXIT, kvm_vcpu_arch, handle_exit); >> OFFSET(KVM_ARCH_HEENTRY, kvm_vcpu_arch, host_eentry); >> diff --git a/arch/loongarch/kvm/main.c b/arch/loongarch/kvm/main.c >> index 3e1005526f4b..6e3e8efa1dc2 100644 >> --- a/arch/loongarch/kvm/main.c >> +++ b/arch/loongarch/kvm/main.c >> @@ -223,6 +223,7 @@ static void kvm_update_vpid(struct kvm_vcpu *vcpu, int cpu) >> >> context->vpid_cache = vpid; >> vcpu->arch.vpid = vpid; >> + vcpu->arch.vmid = vcpu->arch.vpid & vpid_mask; > > I think both vpid and vmid need "& vpid_mask". vpid used in function kvm_check_vcpuid() includes version information also. vmid here is hardware id directly used by LOONGARCH_CSR_GTLBC in arch/loongarch/kvm/switch.S. Regards Bibo Mao > > > Huacai > >> } >> >> void kvm_check_vpid(struct kvm_vcpu *vcpu) >> diff --git a/arch/loongarch/kvm/switch.S b/arch/loongarch/kvm/switch.S >> index 936e4ae3e408..af972394fd55 100644 >> --- a/arch/loongarch/kvm/switch.S >> +++ b/arch/loongarch/kvm/switch.S >> @@ -66,9 +66,8 @@ >> ld.d t0, a2, KVM_ARCH_KVMPGD >> csrwr t0, LOONGARCH_CSR_PGDL >> >> - /* Mix GID and RID */ >> - csrrd t1, LOONGARCH_CSR_GSTAT >> - bstrpick.w t1, t1, CSR_GSTAT_GID_SHIFT_END, CSR_GSTAT_GID_SHIFT >> + /* Set VMID for gpa --> hpa mapping */ >> + ld.d t1, a2, KVM_ARCH_VMID >> csrrd t0, LOONGARCH_CSR_GTLBC >> bstrins.w t0, t1, CSR_GTLBC_TGID_SHIFT_END, CSR_GTLBC_TGID_SHIFT >> csrwr t0, LOONGARCH_CSR_GTLBC >> diff --git a/arch/loongarch/kvm/tlb.c b/arch/loongarch/kvm/tlb.c >> index ebdbe9264e9c..38daf936021d 100644 >> --- a/arch/loongarch/kvm/tlb.c >> +++ b/arch/loongarch/kvm/tlb.c >> @@ -23,7 +23,10 @@ void kvm_flush_tlb_all(void) >> >> void kvm_flush_tlb_gpa(struct kvm_vcpu *vcpu, unsigned long gpa) >> { >> + unsigned int vmid; >> + >> lockdep_assert_irqs_disabled(); >> gpa &= (PAGE_MASK << 1); >> - invtlb(INVTLB_GID_ADDR, read_csr_gstat() & CSR_GSTAT_GID, gpa); >> + vmid = (vcpu->arch.vmid << CSR_GSTAT_GID_SHIFT) & CSR_GSTAT_GID; >> + invtlb(INVTLB_GID_ADDR, vmid, gpa); >> } >> -- >> 2.39.3 >>