[RFC 6/6] KVM: arm64: Add tracepoints for TLBID vDomain load events

Jinqian Yang yangjinqian1 at huawei.com
Thu Oct 29 23:56:17 PDT 2026


kvm_tlbid_vcpu_info logs each vCPU's vDomain bitmap on migration,
and kvm_tlbid_domain_mapping logs the pCPU mask and physical domain
mapped for each vDomain, covering both the default vDomain0 mapping
and the per-vDomain updates.

Signed-off-by: Jinqian Yang <yangjinqian1 at huawei.com>
---
 arch/arm64/kvm/arm.c       | 10 ++++++++
 arch/arm64/kvm/trace_arm.h | 47 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 57 insertions(+)

diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c
index b5ab89db1c07..0352d62cea18 100644
--- a/arch/arm64/kvm/arm.c
+++ b/arch/arm64/kvm/arm.c
@@ -954,6 +954,9 @@ static void kvm_tlbidomain_vcpu_load(struct kvm_vcpu *vcpu)
 				      max_vdomains);
 		}
 	}
+	trace_kvm_tlbid_vcpu_info(vcpu->vcpu_idx, vcpu->cpu,
+				  current_data->last_pcpu,
+				  current_data->vdomain_bitmap);
 
 	if (!vdomain->guest_tlbid_enabled) {
 		old_map = vdomain->domain_map[0];
@@ -966,6 +969,10 @@ static void kvm_tlbidomain_vcpu_load(struct kvm_vcpu *vcpu)
 							   0,
 							   current_data->last_pcpu,
 							   test_bit(0, clear_bits));
+		trace_kvm_tlbid_domain_mapping(0,
+					       vdomain->vdomain_cpumasks[0],
+					       vdomain->domain_map[0]);
+
 		if (vdomain->domain_map[0] == old_map)
 			goto unlock;
 	} else {
@@ -983,6 +990,9 @@ static void kvm_tlbidomain_vcpu_load(struct kvm_vcpu *vcpu)
 								   i,
 								   current_data->last_pcpu,
 								   test_bit(i, clear_bits));
+			trace_kvm_tlbid_domain_mapping(i,
+						       vdomain->vdomain_cpumasks[i],
+						       vdomain->domain_map[i]);
 
 			if (vdomain->domain_map[i] != old_map)
 				domain_map_changed = true;
diff --git a/arch/arm64/kvm/trace_arm.h b/arch/arm64/kvm/trace_arm.h
index 9c60f6465c78..0e8faeb8964e 100644
--- a/arch/arm64/kvm/trace_arm.h
+++ b/arch/arm64/kvm/trace_arm.h
@@ -415,6 +415,53 @@ TRACE_EVENT(kvm_forward_sysreg_trap,
 		      sys_reg_Op2(__entry->sysreg))
 );
 
+TRACE_EVENT(kvm_tlbid_vcpu_info,
+	TP_PROTO(int vcpu_idx, int current_pcpu, int last_pcpu,
+		 u32 vdomain_bitmap),
+	TP_ARGS(vcpu_idx, current_pcpu, last_pcpu, vdomain_bitmap),
+
+	TP_STRUCT__entry(
+		__field(int,	vcpu_idx)
+		__field(int,	current_pcpu)
+		__field(int,	last_pcpu)
+		__field(u32,	vdomain_bitmap)
+	),
+
+	TP_fast_assign(
+		__entry->vcpu_idx	= vcpu_idx;
+		__entry->current_pcpu	= current_pcpu;
+		__entry->last_pcpu	= last_pcpu;
+		__entry->vdomain_bitmap	= vdomain_bitmap;
+	),
+
+	TP_printk("vcpu=%d current_pcpu=%d last_pcpu=%d vdomain_bitmap=0x%x",
+		  __entry->vcpu_idx, __entry->current_pcpu,
+		  __entry->last_pcpu, __entry->vdomain_bitmap)
+);
+
+TRACE_EVENT(kvm_tlbid_domain_mapping,
+	TP_PROTO(int vdomain_id, const struct cpumask *cpumask,
+		 int pdomain_id),
+	TP_ARGS(vdomain_id, cpumask, pdomain_id),
+
+	TP_STRUCT__entry(
+		__field(int,	vdomain_id)
+		__cpumask(cpumask)
+		__field(int,	pdomain_id)
+	),
+
+	TP_fast_assign(
+		__entry->vdomain_id	= vdomain_id;
+		__assign_cpumask(cpumask, cpumask_bits(cpumask));
+		__entry->pdomain_id	= pdomain_id;
+	),
+
+	TP_printk("Domain mapping: vDomain=%d, cpumask=%s, pDomain=%d",
+		  __entry->vdomain_id,
+		  __get_cpumask(cpumask),
+		  __entry->pdomain_id)
+);
+
 #endif /* _TRACE_ARM_ARM64_KVM_H */
 
 #undef TRACE_INCLUDE_PATH
-- 
2.33.0




More information about the linux-arm-kernel mailing list