FROMLIST: virt: geniezone: Add tracing support for hyp call and vcpu exit_reason

Add tracepoints for hypervisor calls and VCPU exit reasons in GenieZone
driver. It aids performance debugging by providing more information
about hypervisor operations and VCPU behavior.

Command Usage:
echo geniezone:* >> /sys/kernel/tracing/set_event
echo 1 > /sys/kernel/tracing/tracing_on
echo 0 > /sys/kernel/tracing/tracing_on
cat /sys/kernel/tracing/trace

For example:
crosvm_vcpu0-4874    [007] .....    94.757349: mtk_hypcall_enter: id=0xfb001005
crosvm_vcpu0-4874    [007] .....    94.760902: mtk_hypcall_leave: id=0xfb001005 invalid=0
crosvm_vcpu0-4874    [007] .....    94.760902: mtk_vcpu_exit: vcpu exit_reason=IRQ(0x92920003)

This example tracks a hypervisor function call by an ID (`0xbb001005`)
from initiation to termination, which is supported (invalid=0). A vCPU
exit is triggered by an Interrupt Request (IRQ) (exit reason: 0x92920003).

/* VM exit reason */
enum {
	GZVM_EXIT_UNKNOWN = 0x92920000,
	GZVM_EXIT_MMIO = 0x92920001,
	GZVM_EXIT_HYPERCALL = 0x92920002,
	GZVM_EXIT_IRQ = 0x92920003,
	GZVM_EXIT_EXCEPTION = 0x92920004,
	GZVM_EXIT_DEBUG = 0x92920005,
	GZVM_EXIT_FAIL_ENTRY = 0x92920006,
	GZVM_EXIT_INTERNAL_ERROR = 0x92920007,
	GZVM_EXIT_SYSTEM_EVENT = 0x92920008,
	GZVM_EXIT_SHUTDOWN = 0x92920009,
	GZVM_EXIT_GZ = 0x9292000a,
};

Reviewed-by: Steven Rostedt (Google) <rostedt@goodmis.org>
Signed-off-by: Yi-De Wu <yi-de.wu@mediatek.com>
Signed-off-by: Liju Chen <liju-clr.chen@mediatek.com>
Change-Id: I83e8448316c6399d53ea564f5b37c0e31f1eee2a
Bug: 379230831
Link: https://lore.kernel.org/lkml/20241114100802.4116-21-liju-clr.chen@mediatek.com/
This commit is contained in:
Liju Chen
2023-10-16 09:13:58 +08:00
committed by Liju-clr Chen
parent 164e3d6558
commit 66a0f826f2
3 changed files with 91 additions and 0 deletions
+4
View File
@@ -7,6 +7,8 @@
#include <linux/err.h>
#include <linux/uaccess.h>
#define CREATE_TRACE_POINTS
#include <trace/events/geniezone.h>
#include <linux/gzvm.h>
#include <linux/soc/mediatek/gzvm_drv.h>
#include "gzvm_arch_common.h"
@@ -44,11 +46,13 @@ int gzvm_hypcall_wrapper(unsigned long a0, unsigned long a1,
.a6 = a6,
.a7 = a7,
};
trace_mtk_hypcall_enter(a0);
arm_smccc_1_2_hvc(&args, &res_1_2);
res->a0 = res_1_2.a0;
res->a1 = res_1_2.a1;
res->a2 = res_1_2.a2;
res->a3 = res_1_2.a3;
trace_mtk_hypcall_leave(a0, (res->a0 != ERR_NOT_SUPPORTED) ? 0 : 1);
return gzvm_err_to_errno(res->a0);
}
+3
View File
@@ -9,6 +9,8 @@
#include <linux/mm.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <trace/events/geniezone.h>
#include <linux/soc/mediatek/gzvm_drv.h>
/* maximum size needed for holding an integer */
@@ -102,6 +104,7 @@ static long gzvm_vcpu_run(struct gzvm_vcpu *vcpu, void __user *argp)
while (!need_userspace && !signal_pending(current)) {
gzvm_arch_vcpu_run(vcpu, &exit_reason);
trace_mtk_vcpu_exit(exit_reason);
switch (exit_reason) {
case GZVM_EXIT_MMIO:
+84
View File
@@ -0,0 +1,84 @@
/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright (c) 2023 MediaTek Inc.
*/
#undef TRACE_SYSTEM
#define TRACE_SYSTEM geniezone
#define _TRACE_GENIEZONE_H
#include <linux/gzvm.h>
#include <linux/tracepoint.h>
#define GZVM_EXIT_REASONS \
EM(UNKNOWN)\
EM(MMIO)\
EM(HYPERCALL)\
EM(IRQ)\
EM(EXCEPTION)\
EM(DEBUG)\
EM(FAIL_ENTRY)\
EM(INTERNAL_ERROR)\
EM(SYSTEM_EVENT)\
EM(SHUTDOWN)\
EMe(GZ)
#undef EM
#undef EMe
#define EM(a) TRACE_DEFINE_ENUM(GZVM_EXIT_##a);
#define EMe(a) TRACE_DEFINE_ENUM(GZVM_EXIT_##a);
GZVM_EXIT_REASONS
#undef EM
#undef EMe
#define EM(a) { GZVM_EXIT_##a, #a },
#define EMe(a) { GZVM_EXIT_##a, #a }
TRACE_EVENT(mtk_hypcall_enter,
TP_PROTO(unsigned long id),
TP_ARGS(id),
TP_STRUCT__entry(__field(unsigned long, id)),
TP_fast_assign(__entry->id = id;),
TP_printk("id=0x%lx", __entry->id)
);
TRACE_EVENT(mtk_hypcall_leave,
TP_PROTO(unsigned long id, unsigned long invalid),
TP_ARGS(id, invalid),
TP_STRUCT__entry(__field(unsigned long, id)
__field(unsigned long, invalid)
),
TP_fast_assign(__entry->id = id;
__entry->invalid = invalid;
),
TP_printk("id=0x%lx invalid=%lu", __entry->id, __entry->invalid)
);
TRACE_EVENT(mtk_vcpu_exit,
TP_PROTO(unsigned long exit_reason),
TP_ARGS(exit_reason),
TP_STRUCT__entry(__field(unsigned long, exit_reason)),
TP_fast_assign(__entry->exit_reason = exit_reason;),
TP_printk("vcpu exit_reason=%s(0x%lx)",
__print_symbolic(__entry->exit_reason, GZVM_EXIT_REASONS),
__entry->exit_reason)
);
/* This part must be outside protection */
#include <trace/define_trace.h>