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