mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00

While creating a new monitor in RV, besides generating code from dot2k, there are a few manual steps which can be tedious and error prone, like adding the tracepoints, makefile lines and kconfig. This patch restructures the existing monitors to keep some files in the monitor's folder itself, which can be automatically generated by future versions of dot2k. Monitors have now their own Kconfig and tracepoint snippets. For simplicity, the main tracepoint definition, is moved to the RV directory, it defines only the tracepoint classes and includes the monitor-specific tracepoints, which reside in the monitor directory. Tracepoints and Kconfig no longer need to be copied and adapted from existing ones but only need to be included in the main files. The Makefile remains untouched since there's little advantage in having a separated Makefile for each monitor with a single line and including it in the main RV Makefile. Cc: Juri Lelli <juri.lelli@redhat.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: John Kacur <jkacur@redhat.com> Link: https://lore.kernel.org/20241227144752.362911-6-gmonaco@redhat.com Signed-off-by: Gabriele Monaco <gmonaco@redhat.com> Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
89 lines
2.0 KiB
C
89 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 "wip"
|
|
|
|
#include <rv_trace.h>
|
|
#include <trace/events/sched.h>
|
|
#include <trace/events/preemptirq.h>
|
|
|
|
#include "wip.h"
|
|
|
|
static struct rv_monitor rv_wip;
|
|
DECLARE_DA_MON_PER_CPU(wip, unsigned char);
|
|
|
|
static void handle_preempt_disable(void *data, unsigned long ip, unsigned long parent_ip)
|
|
{
|
|
da_handle_event_wip(preempt_disable_wip);
|
|
}
|
|
|
|
static void handle_preempt_enable(void *data, unsigned long ip, unsigned long parent_ip)
|
|
{
|
|
da_handle_start_event_wip(preempt_enable_wip);
|
|
}
|
|
|
|
static void handle_sched_waking(void *data, struct task_struct *task)
|
|
{
|
|
da_handle_event_wip(sched_waking_wip);
|
|
}
|
|
|
|
static int enable_wip(void)
|
|
{
|
|
int retval;
|
|
|
|
retval = da_monitor_init_wip();
|
|
if (retval)
|
|
return retval;
|
|
|
|
rv_attach_trace_probe("wip", preempt_enable, handle_preempt_enable);
|
|
rv_attach_trace_probe("wip", sched_waking, handle_sched_waking);
|
|
rv_attach_trace_probe("wip", preempt_disable, handle_preempt_disable);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void disable_wip(void)
|
|
{
|
|
rv_wip.enabled = 0;
|
|
|
|
rv_detach_trace_probe("wip", preempt_disable, handle_preempt_disable);
|
|
rv_detach_trace_probe("wip", preempt_enable, handle_preempt_enable);
|
|
rv_detach_trace_probe("wip", sched_waking, handle_sched_waking);
|
|
|
|
da_monitor_destroy_wip();
|
|
}
|
|
|
|
static struct rv_monitor rv_wip = {
|
|
.name = "wip",
|
|
.description = "wakeup in preemptive per-cpu testing monitor.",
|
|
.enable = enable_wip,
|
|
.disable = disable_wip,
|
|
.reset = da_monitor_reset_all_wip,
|
|
.enabled = 0,
|
|
};
|
|
|
|
static int __init register_wip(void)
|
|
{
|
|
rv_register_monitor(&rv_wip);
|
|
return 0;
|
|
}
|
|
|
|
static void __exit unregister_wip(void)
|
|
{
|
|
rv_unregister_monitor(&rv_wip);
|
|
}
|
|
|
|
module_init(register_wip);
|
|
module_exit(unregister_wip);
|
|
|
|
MODULE_LICENSE("GPL");
|
|
MODULE_AUTHOR("Daniel Bristot de Oliveira <bristot@kernel.org>");
|
|
MODULE_DESCRIPTION("wip: wakeup in preemptive - per-cpu sample monitor.");
|