diff mbox series

LoongArch: KVM: Add mmio trace support

Message ID 20240409094900.1118699-1-maobibo@loongson.cn (mailing list archive)
State New, archived
Headers show
Series LoongArch: KVM: Add mmio trace support | expand

Commit Message

maobibo April 9, 2024, 9:49 a.m. UTC
Add mmio trace event support, currently generic mmio events
KVM_TRACE_MMIO_WRITE/xxx_READ/xx_READ_UNSATISFIED are added here.

Also vcpu id field is added for all kvm trace events, since perf
KVM tool parses vcpu id information for kvm entry event.

Signed-off-by: Bibo Mao <maobibo@loongson.cn>
---
 arch/loongarch/kvm/exit.c  |  7 +++++++
 arch/loongarch/kvm/trace.h | 20 ++++++++++++++------
 2 files changed, 21 insertions(+), 6 deletions(-)


base-commit: fec50db7033ea478773b159e0e2efb135270e3b7

Comments

maobibo April 19, 2024, 2:36 a.m. UTC | #1
slightly ping...

On 2024/4/9 下午5:49, Bibo Mao wrote:
> Add mmio trace event support, currently generic mmio events
> KVM_TRACE_MMIO_WRITE/xxx_READ/xx_READ_UNSATISFIED are added here.
> 
> Also vcpu id field is added for all kvm trace events, since perf
> KVM tool parses vcpu id information for kvm entry event.
> 
> Signed-off-by: Bibo Mao <maobibo@loongson.cn>
> ---
>   arch/loongarch/kvm/exit.c  |  7 +++++++
>   arch/loongarch/kvm/trace.h | 20 ++++++++++++++------
>   2 files changed, 21 insertions(+), 6 deletions(-)
> 
> diff --git a/arch/loongarch/kvm/exit.c b/arch/loongarch/kvm/exit.c
> index ed1d89d53e2e..3c05aade0122 100644
> --- a/arch/loongarch/kvm/exit.c
> +++ b/arch/loongarch/kvm/exit.c
> @@ -9,6 +9,7 @@
>   #include <linux/module.h>
>   #include <linux/preempt.h>
>   #include <linux/vmalloc.h>
> +#include <trace/events/kvm.h>
>   #include <asm/fpu.h>
>   #include <asm/inst.h>
>   #include <asm/loongarch.h>
> @@ -417,6 +418,8 @@ int kvm_emu_mmio_read(struct kvm_vcpu *vcpu, larch_inst inst)
>   		vcpu->arch.io_gpr = rd;
>   		run->mmio.is_write = 0;
>   		vcpu->mmio_is_write = 0;
> +		trace_kvm_mmio(KVM_TRACE_MMIO_READ_UNSATISFIED, run->mmio.len,
> +				run->mmio.phys_addr, NULL);
>   	} else {
>   		kvm_err("Read not supported Inst=0x%08x @%lx BadVaddr:%#lx\n",
>   			inst.word, vcpu->arch.pc, vcpu->arch.badv);
> @@ -463,6 +466,8 @@ int kvm_complete_mmio_read(struct kvm_vcpu *vcpu, struct kvm_run *run)
>   		break;
>   	}
>   
> +	trace_kvm_mmio(KVM_TRACE_MMIO_READ, run->mmio.len,
> +			run->mmio.phys_addr, run->mmio.data);
>   	return er;
>   }
>   
> @@ -564,6 +569,8 @@ int kvm_emu_mmio_write(struct kvm_vcpu *vcpu, larch_inst inst)
>   		run->mmio.is_write = 1;
>   		vcpu->mmio_needed = 1;
>   		vcpu->mmio_is_write = 1;
> +		trace_kvm_mmio(KVM_TRACE_MMIO_WRITE, run->mmio.len,
> +				run->mmio.phys_addr, data);
>   	} else {
>   		vcpu->arch.pc = curr_pc;
>   		kvm_err("Write not supported Inst=0x%08x @%lx BadVaddr:%#lx\n",
> diff --git a/arch/loongarch/kvm/trace.h b/arch/loongarch/kvm/trace.h
> index c2484ad4cffa..1783397b1bc8 100644
> --- a/arch/loongarch/kvm/trace.h
> +++ b/arch/loongarch/kvm/trace.h
> @@ -19,14 +19,16 @@ DECLARE_EVENT_CLASS(kvm_transition,
>   	TP_PROTO(struct kvm_vcpu *vcpu),
>   	TP_ARGS(vcpu),
>   	TP_STRUCT__entry(
> +		__field(unsigned int, vcpu_id)
>   		__field(unsigned long, pc)
>   	),
>   
>   	TP_fast_assign(
> +		__entry->vcpu_id = vcpu->vcpu_id;
>   		__entry->pc = vcpu->arch.pc;
>   	),
>   
> -	TP_printk("PC: 0x%08lx", __entry->pc)
> +	TP_printk("vcpu %u PC: 0x%08lx", __entry->vcpu_id, __entry->pc)
>   );
>   
>   DEFINE_EVENT(kvm_transition, kvm_enter,
> @@ -54,19 +56,22 @@ DECLARE_EVENT_CLASS(kvm_exit,
>   	    TP_PROTO(struct kvm_vcpu *vcpu, unsigned int reason),
>   	    TP_ARGS(vcpu, reason),
>   	    TP_STRUCT__entry(
> +			__field(unsigned int, vcpu_id)
>   			__field(unsigned long, pc)
>   			__field(unsigned int, reason)
>   	    ),
>   
>   	    TP_fast_assign(
> +			__entry->vcpu_id = vcpu->vcpu_id;
>   			__entry->pc = vcpu->arch.pc;
>   			__entry->reason = reason;
>   	    ),
>   
> -	    TP_printk("[%s]PC: 0x%08lx",
> -		      __print_symbolic(__entry->reason,
> -				       kvm_trace_symbol_exit_types),
> -		      __entry->pc)
> +	    TP_printk("vcpu %u [%s] PC: 0x%08lx",
> +			__entry->vcpu_id,
> +			__print_symbolic(__entry->reason,
> +				kvm_trace_symbol_exit_types),
> +			__entry->pc)
>   );
>   
>   DEFINE_EVENT(kvm_exit, kvm_exit_idle,
> @@ -85,14 +90,17 @@ TRACE_EVENT(kvm_exit_gspr,
>   	    TP_PROTO(struct kvm_vcpu *vcpu, unsigned int inst_word),
>   	    TP_ARGS(vcpu, inst_word),
>   	    TP_STRUCT__entry(
> +			__field(unsigned int, vcpu_id)
>   			__field(unsigned int, inst_word)
>   	    ),
>   
>   	    TP_fast_assign(
> +			__entry->vcpu_id = vcpu->vcpu_id;
>   			__entry->inst_word = inst_word;
>   	    ),
>   
> -	    TP_printk("Inst word: 0x%08x", __entry->inst_word)
> +	    TP_printk("vcpu %u Inst word: 0x%08x", __entry->vcpu_id,
> +			__entry->inst_word)
>   );
>   
>   #define KVM_TRACE_AUX_SAVE		0
> 
> base-commit: fec50db7033ea478773b159e0e2efb135270e3b7
>
diff mbox series

Patch

diff --git a/arch/loongarch/kvm/exit.c b/arch/loongarch/kvm/exit.c
index ed1d89d53e2e..3c05aade0122 100644
--- a/arch/loongarch/kvm/exit.c
+++ b/arch/loongarch/kvm/exit.c
@@ -9,6 +9,7 @@ 
 #include <linux/module.h>
 #include <linux/preempt.h>
 #include <linux/vmalloc.h>
+#include <trace/events/kvm.h>
 #include <asm/fpu.h>
 #include <asm/inst.h>
 #include <asm/loongarch.h>
@@ -417,6 +418,8 @@  int kvm_emu_mmio_read(struct kvm_vcpu *vcpu, larch_inst inst)
 		vcpu->arch.io_gpr = rd;
 		run->mmio.is_write = 0;
 		vcpu->mmio_is_write = 0;
+		trace_kvm_mmio(KVM_TRACE_MMIO_READ_UNSATISFIED, run->mmio.len,
+				run->mmio.phys_addr, NULL);
 	} else {
 		kvm_err("Read not supported Inst=0x%08x @%lx BadVaddr:%#lx\n",
 			inst.word, vcpu->arch.pc, vcpu->arch.badv);
@@ -463,6 +466,8 @@  int kvm_complete_mmio_read(struct kvm_vcpu *vcpu, struct kvm_run *run)
 		break;
 	}
 
+	trace_kvm_mmio(KVM_TRACE_MMIO_READ, run->mmio.len,
+			run->mmio.phys_addr, run->mmio.data);
 	return er;
 }
 
@@ -564,6 +569,8 @@  int kvm_emu_mmio_write(struct kvm_vcpu *vcpu, larch_inst inst)
 		run->mmio.is_write = 1;
 		vcpu->mmio_needed = 1;
 		vcpu->mmio_is_write = 1;
+		trace_kvm_mmio(KVM_TRACE_MMIO_WRITE, run->mmio.len,
+				run->mmio.phys_addr, data);
 	} else {
 		vcpu->arch.pc = curr_pc;
 		kvm_err("Write not supported Inst=0x%08x @%lx BadVaddr:%#lx\n",
diff --git a/arch/loongarch/kvm/trace.h b/arch/loongarch/kvm/trace.h
index c2484ad4cffa..1783397b1bc8 100644
--- a/arch/loongarch/kvm/trace.h
+++ b/arch/loongarch/kvm/trace.h
@@ -19,14 +19,16 @@  DECLARE_EVENT_CLASS(kvm_transition,
 	TP_PROTO(struct kvm_vcpu *vcpu),
 	TP_ARGS(vcpu),
 	TP_STRUCT__entry(
+		__field(unsigned int, vcpu_id)
 		__field(unsigned long, pc)
 	),
 
 	TP_fast_assign(
+		__entry->vcpu_id = vcpu->vcpu_id;
 		__entry->pc = vcpu->arch.pc;
 	),
 
-	TP_printk("PC: 0x%08lx", __entry->pc)
+	TP_printk("vcpu %u PC: 0x%08lx", __entry->vcpu_id, __entry->pc)
 );
 
 DEFINE_EVENT(kvm_transition, kvm_enter,
@@ -54,19 +56,22 @@  DECLARE_EVENT_CLASS(kvm_exit,
 	    TP_PROTO(struct kvm_vcpu *vcpu, unsigned int reason),
 	    TP_ARGS(vcpu, reason),
 	    TP_STRUCT__entry(
+			__field(unsigned int, vcpu_id)
 			__field(unsigned long, pc)
 			__field(unsigned int, reason)
 	    ),
 
 	    TP_fast_assign(
+			__entry->vcpu_id = vcpu->vcpu_id;
 			__entry->pc = vcpu->arch.pc;
 			__entry->reason = reason;
 	    ),
 
-	    TP_printk("[%s]PC: 0x%08lx",
-		      __print_symbolic(__entry->reason,
-				       kvm_trace_symbol_exit_types),
-		      __entry->pc)
+	    TP_printk("vcpu %u [%s] PC: 0x%08lx",
+			__entry->vcpu_id,
+			__print_symbolic(__entry->reason,
+				kvm_trace_symbol_exit_types),
+			__entry->pc)
 );
 
 DEFINE_EVENT(kvm_exit, kvm_exit_idle,
@@ -85,14 +90,17 @@  TRACE_EVENT(kvm_exit_gspr,
 	    TP_PROTO(struct kvm_vcpu *vcpu, unsigned int inst_word),
 	    TP_ARGS(vcpu, inst_word),
 	    TP_STRUCT__entry(
+			__field(unsigned int, vcpu_id)
 			__field(unsigned int, inst_word)
 	    ),
 
 	    TP_fast_assign(
+			__entry->vcpu_id = vcpu->vcpu_id;
 			__entry->inst_word = inst_word;
 	    ),
 
-	    TP_printk("Inst word: 0x%08x", __entry->inst_word)
+	    TP_printk("vcpu %u Inst word: 0x%08x", __entry->vcpu_id,
+			__entry->inst_word)
 );
 
 #define KVM_TRACE_AUX_SAVE		0