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:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user