18812d212SDaniel Bristot de Oliveira // SPDX-License-Identifier: GPL-2.0
28812d212SDaniel Bristot de Oliveira #include <linux/ftrace.h>
38812d212SDaniel Bristot de Oliveira #include <linux/tracepoint.h>
48812d212SDaniel Bristot de Oliveira #include <linux/kernel.h>
58812d212SDaniel Bristot de Oliveira #include <linux/module.h>
68812d212SDaniel Bristot de Oliveira #include <linux/init.h>
78812d212SDaniel Bristot de Oliveira #include <linux/rv.h>
88812d212SDaniel Bristot de Oliveira #include <rv/instrumentation.h>
98812d212SDaniel Bristot de Oliveira #include <rv/da_monitor.h>
108812d212SDaniel Bristot de Oliveira
118812d212SDaniel Bristot de Oliveira #define MODULE_NAME "wip"
128812d212SDaniel Bristot de Oliveira
138812d212SDaniel Bristot de Oliveira #include <trace/events/rv.h>
1410bde81cSDaniel Bristot de Oliveira #include <trace/events/sched.h>
1510bde81cSDaniel Bristot de Oliveira #include <trace/events/preemptirq.h>
168812d212SDaniel Bristot de Oliveira
178812d212SDaniel Bristot de Oliveira #include "wip.h"
188812d212SDaniel Bristot de Oliveira
1901c44bf8SZeng Heng static struct rv_monitor rv_wip;
208812d212SDaniel Bristot de Oliveira DECLARE_DA_MON_PER_CPU(wip, unsigned char);
218812d212SDaniel Bristot de Oliveira
handle_preempt_disable(void * data,unsigned long ip,unsigned long parent_ip)2210bde81cSDaniel Bristot de Oliveira static void handle_preempt_disable(void *data, unsigned long ip, unsigned long parent_ip)
238812d212SDaniel Bristot de Oliveira {
248812d212SDaniel Bristot de Oliveira da_handle_event_wip(preempt_disable_wip);
258812d212SDaniel Bristot de Oliveira }
268812d212SDaniel Bristot de Oliveira
handle_preempt_enable(void * data,unsigned long ip,unsigned long parent_ip)2710bde81cSDaniel Bristot de Oliveira static void handle_preempt_enable(void *data, unsigned long ip, unsigned long parent_ip)
288812d212SDaniel Bristot de Oliveira {
2910bde81cSDaniel Bristot de Oliveira da_handle_start_event_wip(preempt_enable_wip);
308812d212SDaniel Bristot de Oliveira }
318812d212SDaniel Bristot de Oliveira
handle_sched_waking(void * data,struct task_struct * task)3210bde81cSDaniel Bristot de Oliveira static void handle_sched_waking(void *data, struct task_struct *task)
338812d212SDaniel Bristot de Oliveira {
348812d212SDaniel Bristot de Oliveira da_handle_event_wip(sched_waking_wip);
358812d212SDaniel Bristot de Oliveira }
368812d212SDaniel Bristot de Oliveira
enable_wip(void)378812d212SDaniel Bristot de Oliveira static int enable_wip(void)
388812d212SDaniel Bristot de Oliveira {
398812d212SDaniel Bristot de Oliveira int retval;
408812d212SDaniel Bristot de Oliveira
418812d212SDaniel Bristot de Oliveira retval = da_monitor_init_wip();
428812d212SDaniel Bristot de Oliveira if (retval)
438812d212SDaniel Bristot de Oliveira return retval;
448812d212SDaniel Bristot de Oliveira
4510bde81cSDaniel Bristot de Oliveira rv_attach_trace_probe("wip", preempt_enable, handle_preempt_enable);
4610bde81cSDaniel Bristot de Oliveira rv_attach_trace_probe("wip", sched_waking, handle_sched_waking);
4710bde81cSDaniel Bristot de Oliveira rv_attach_trace_probe("wip", preempt_disable, handle_preempt_disable);
488812d212SDaniel Bristot de Oliveira
498812d212SDaniel Bristot de Oliveira return 0;
508812d212SDaniel Bristot de Oliveira }
518812d212SDaniel Bristot de Oliveira
disable_wip(void)528812d212SDaniel Bristot de Oliveira static void disable_wip(void)
538812d212SDaniel Bristot de Oliveira {
548812d212SDaniel Bristot de Oliveira rv_wip.enabled = 0;
558812d212SDaniel Bristot de Oliveira
5610bde81cSDaniel Bristot de Oliveira rv_detach_trace_probe("wip", preempt_disable, handle_preempt_disable);
5710bde81cSDaniel Bristot de Oliveira rv_detach_trace_probe("wip", preempt_enable, handle_preempt_enable);
5810bde81cSDaniel Bristot de Oliveira rv_detach_trace_probe("wip", sched_waking, handle_sched_waking);
598812d212SDaniel Bristot de Oliveira
608812d212SDaniel Bristot de Oliveira da_monitor_destroy_wip();
618812d212SDaniel Bristot de Oliveira }
628812d212SDaniel Bristot de Oliveira
6301c44bf8SZeng Heng static struct rv_monitor rv_wip = {
648812d212SDaniel Bristot de Oliveira .name = "wip",
6510bde81cSDaniel Bristot de Oliveira .description = "wakeup in preemptive per-cpu testing monitor.",
668812d212SDaniel Bristot de Oliveira .enable = enable_wip,
678812d212SDaniel Bristot de Oliveira .disable = disable_wip,
688812d212SDaniel Bristot de Oliveira .reset = da_monitor_reset_all_wip,
698812d212SDaniel Bristot de Oliveira .enabled = 0,
708812d212SDaniel Bristot de Oliveira };
718812d212SDaniel Bristot de Oliveira
register_wip(void)72*834168fbSXiu Jianfeng static int __init register_wip(void)
738812d212SDaniel Bristot de Oliveira {
748812d212SDaniel Bristot de Oliveira rv_register_monitor(&rv_wip);
758812d212SDaniel Bristot de Oliveira return 0;
768812d212SDaniel Bristot de Oliveira }
778812d212SDaniel Bristot de Oliveira
unregister_wip(void)78*834168fbSXiu Jianfeng static void __exit unregister_wip(void)
798812d212SDaniel Bristot de Oliveira {
808812d212SDaniel Bristot de Oliveira rv_unregister_monitor(&rv_wip);
818812d212SDaniel Bristot de Oliveira }
828812d212SDaniel Bristot de Oliveira
838812d212SDaniel Bristot de Oliveira module_init(register_wip);
848812d212SDaniel Bristot de Oliveira module_exit(unregister_wip);
858812d212SDaniel Bristot de Oliveira
868812d212SDaniel Bristot de Oliveira MODULE_LICENSE("GPL");
8710bde81cSDaniel Bristot de Oliveira MODULE_AUTHOR("Daniel Bristot de Oliveira <bristot@kernel.org>");
8810bde81cSDaniel Bristot de Oliveira MODULE_DESCRIPTION("wip: wakeup in preemptive - per-cpu sample monitor.");
89