mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-10-22 15:03:53 +02: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>
88 lines
1.9 KiB
C
88 lines
1.9 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 "wwnr"
|
|
|
|
#include <rv_trace.h>
|
|
#include <trace/events/sched.h>
|
|
|
|
#include "wwnr.h"
|
|
|
|
static struct rv_monitor rv_wwnr;
|
|
DECLARE_DA_MON_PER_TASK(wwnr, unsigned char);
|
|
|
|
static void handle_switch(void *data, bool preempt, struct task_struct *p,
|
|
struct task_struct *n, unsigned int prev_state)
|
|
{
|
|
/* start monitoring only after the first suspension */
|
|
if (prev_state == TASK_INTERRUPTIBLE)
|
|
da_handle_start_event_wwnr(p, switch_out_wwnr);
|
|
else
|
|
da_handle_event_wwnr(p, switch_out_wwnr);
|
|
|
|
da_handle_event_wwnr(n, switch_in_wwnr);
|
|
}
|
|
|
|
static void handle_wakeup(void *data, struct task_struct *p)
|
|
{
|
|
da_handle_event_wwnr(p, wakeup_wwnr);
|
|
}
|
|
|
|
static int enable_wwnr(void)
|
|
{
|
|
int retval;
|
|
|
|
retval = da_monitor_init_wwnr();
|
|
if (retval)
|
|
return retval;
|
|
|
|
rv_attach_trace_probe("wwnr", sched_switch, handle_switch);
|
|
rv_attach_trace_probe("wwnr", sched_wakeup, handle_wakeup);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void disable_wwnr(void)
|
|
{
|
|
rv_wwnr.enabled = 0;
|
|
|
|
rv_detach_trace_probe("wwnr", sched_switch, handle_switch);
|
|
rv_detach_trace_probe("wwnr", sched_wakeup, handle_wakeup);
|
|
|
|
da_monitor_destroy_wwnr();
|
|
}
|
|
|
|
static struct rv_monitor rv_wwnr = {
|
|
.name = "wwnr",
|
|
.description = "wakeup while not running per-task testing model.",
|
|
.enable = enable_wwnr,
|
|
.disable = disable_wwnr,
|
|
.reset = da_monitor_reset_all_wwnr,
|
|
.enabled = 0,
|
|
};
|
|
|
|
static int __init register_wwnr(void)
|
|
{
|
|
rv_register_monitor(&rv_wwnr);
|
|
return 0;
|
|
}
|
|
|
|
static void __exit unregister_wwnr(void)
|
|
{
|
|
rv_unregister_monitor(&rv_wwnr);
|
|
}
|
|
|
|
module_init(register_wwnr);
|
|
module_exit(unregister_wwnr);
|
|
|
|
MODULE_LICENSE("GPL");
|
|
MODULE_AUTHOR("Daniel Bristot de Oliveira <bristot@kernel.org>");
|
|
MODULE_DESCRIPTION("wwnr: wakeup while not running monitor");
|