Loading...
// 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 <trace/events/rv.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"); |