2024-04-09 09:49:45

by maobibo

[permalink] [raw]
Subject: [PATCH] LoongArch: KVM: Add mmio trace support

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 <[email protected]>
---
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
--
2.39.3



2024-04-19 02:36:34

by maobibo

[permalink] [raw]
Subject: Re: [PATCH] LoongArch: KVM: Add mmio trace support

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 <[email protected]>
> ---
> 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
>