mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-20 16:52:28 +00:00
RV now supports nested monitors, this functionality requires a container monitor, which has virtually no functionality besides holding other monitors, and nested monitors, that have a container as parent. Add the -p flag to pass a parent to a monitor, this sets it up while registering the monitor and adds necessary includes and configurations. Add the -c flag to create a container, since containers are empty, we don't allow supplying a dot model or a monitor type, the template is also different since functions to enable and disable the monitor are not defined, nor any tracepoint. The generated header file only allows to include the rv_monitor structure in children monitors. Cc: Ingo Molnar <mingo@redhat.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Juri Lelli <juri.lelli@redhat.com> Link: https://lore.kernel.org/20250305140406.350227-8-gmonaco@redhat.com Signed-off-by: Gabriele Monaco <gmonaco@redhat.com> Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
92 lines
2.0 KiB
C
92 lines
2.0 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
#include <linux/ftrace.h>
|
|
#include <linux/tracepoint.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/module.h>
|
|
#include <linux/init.h>
|
|
#include <linux/rv.h>
|
|
#include <rv/instrumentation.h>
|
|
#include <rv/da_monitor.h>
|
|
|
|
#define MODULE_NAME "%%MODEL_NAME%%"
|
|
|
|
/*
|
|
* XXX: include required tracepoint headers, e.g.,
|
|
* #include <trace/events/sched.h>
|
|
*/
|
|
#include <rv_trace.h>
|
|
%%INCLUDE_PARENT%%
|
|
/*
|
|
* This is the self-generated part of the monitor. Generally, there is no need
|
|
* to touch this section.
|
|
*/
|
|
#include "%%MODEL_NAME%%.h"
|
|
|
|
/*
|
|
* Declare the deterministic automata monitor.
|
|
*
|
|
* The rv monitor reference is needed for the monitor declaration.
|
|
*/
|
|
static struct rv_monitor rv_%%MODEL_NAME%%;
|
|
DECLARE_DA_MON_%%MONITOR_TYPE%%(%%MODEL_NAME%%, %%MIN_TYPE%%);
|
|
|
|
/*
|
|
* This is the instrumentation part of the monitor.
|
|
*
|
|
* This is the section where manual work is required. Here the kernel events
|
|
* are translated into model's event.
|
|
*
|
|
*/
|
|
%%TRACEPOINT_HANDLERS_SKEL%%
|
|
static int enable_%%MODEL_NAME%%(void)
|
|
{
|
|
int retval;
|
|
|
|
retval = da_monitor_init_%%MODEL_NAME%%();
|
|
if (retval)
|
|
return retval;
|
|
|
|
%%TRACEPOINT_ATTACH%%
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void disable_%%MODEL_NAME%%(void)
|
|
{
|
|
rv_%%MODEL_NAME%%.enabled = 0;
|
|
|
|
%%TRACEPOINT_DETACH%%
|
|
|
|
da_monitor_destroy_%%MODEL_NAME%%();
|
|
}
|
|
|
|
/*
|
|
* This is the monitor register section.
|
|
*/
|
|
static struct rv_monitor rv_%%MODEL_NAME%% = {
|
|
.name = "%%MODEL_NAME%%",
|
|
.description = "%%DESCRIPTION%%",
|
|
.enable = enable_%%MODEL_NAME%%,
|
|
.disable = disable_%%MODEL_NAME%%,
|
|
.reset = da_monitor_reset_all_%%MODEL_NAME%%,
|
|
.enabled = 0,
|
|
};
|
|
|
|
static int __init register_%%MODEL_NAME%%(void)
|
|
{
|
|
rv_register_monitor(&rv_%%MODEL_NAME%%, %%PARENT%%);
|
|
return 0;
|
|
}
|
|
|
|
static void __exit unregister_%%MODEL_NAME%%(void)
|
|
{
|
|
rv_unregister_monitor(&rv_%%MODEL_NAME%%);
|
|
}
|
|
|
|
module_init(register_%%MODEL_NAME%%);
|
|
module_exit(unregister_%%MODEL_NAME%%);
|
|
|
|
MODULE_LICENSE("GPL");
|
|
MODULE_AUTHOR("dot2k: auto-generated");
|
|
MODULE_DESCRIPTION("%%MODEL_NAME%%: %%DESCRIPTION%%");
|