Skip to content

Commit

Permalink
rv/monitor: wwnr instrumentation and Makefile/Kconfig entries
Browse files Browse the repository at this point in the history
Adds the instrumentation to the previously created wwnr monitor, as an
example of the developer work. It also adds a Makefile, Kconfig and
tracepoint entries.

Cc: Wim Van Sebroeck <wim@linux-watchdog.org>
Cc: Guenter Roeck <linux@roeck-us.net>
Cc: Jonathan Corbet <corbet@lwn.net>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Will Deacon <will@kernel.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Marco Elver <elver@google.com>
Cc: Dmitry Vyukov <dvyukov@google.com>
Cc: "Paul E. McKenney" <paulmck@kernel.org>
Cc: Shuah Khan <skhan@linuxfoundation.org>
Cc: Gabriele Paoloni <gpaoloni@redhat.com>
Cc: Juri Lelli <juri.lelli@redhat.com>
Cc: Clark Williams <williams@redhat.com>
Cc: linux-doc@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Cc: linux-trace-devel@vger.kernel.org
Signed-off-by: Daniel Bristot de Oliveira <bristot@kernel.org>
  • Loading branch information
Daniel Bristot de Oliveira authored and intel-lab-lkp committed Jun 16, 2022
1 parent 13d11b2 commit 31dad66
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 22 deletions.
12 changes: 12 additions & 0 deletions include/trace/events/rv.h
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,18 @@ DECLARE_EVENT_CLASS(error_da_monitor_id,
__entry->event,
__entry->state)
);

#ifdef CONFIG_RV_MON_WWNR
/* id is the pid of the task */
DEFINE_EVENT(event_da_monitor_id, event_wwnr,
TP_PROTO(int id, char *state, char *event, char *next_state, bool safe),
TP_ARGS(id, state, event, next_state, safe));

DEFINE_EVENT(error_da_monitor_id, error_wwnr,
TP_PROTO(int id, char *state, char *event),
TP_ARGS(id, state, event));
#endif /* CONFIG_RV_MON_WWNR */

#endif /* CONFIG_DA_MON_EVENTS_ID */
#endif /* _TRACE_RV_H */

Expand Down
8 changes: 8 additions & 0 deletions kernel/trace/rv/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,14 @@ config RV_MON_WIP
Enable WIP sample monitor, this is a sample monitor that
illustrates the usage of per-cpu monitors.

config RV_MON_WWNR
select DA_MON_EVENTS_ID
bool "WWNR monitor"
help
Enable WWNR sample monitor, this is a sample monitor that
illustrates the usage of per-task monitor. The model is
broken on purpose: it serves to test reactors.

config RV_REACTORS
bool "Runtime verification reactors"
default y if RV
Expand Down
1 change: 1 addition & 0 deletions kernel/trace/rv/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@
obj-$(CONFIG_RV) += rv.o
obj-$(CONFIG_RV_REACTORS) += rv_reactors.o
obj-$(CONFIG_RV_MON_WIP) += monitors/wip/wip.o
obj-$(CONFIG_RV_MON_WWNR) += monitors/wwnr/wwnr.o
38 changes: 16 additions & 22 deletions kernel/trace/rv/monitors/wwnr/wwnr.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,8 @@

#define MODULE_NAME "wwnr"

/*
* XXX: include required tracepoint headers, e.g.,
* #include <linux/trace/events/sched.h>
*/
#include <trace/events/rv.h>
#include <trace/events/sched.h>

/*
* This is the self-generated part of the monitor. Generally, there is no need
Expand All @@ -37,21 +34,20 @@ DECLARE_DA_MON_PER_TASK(wwnr, char);
* are translated into model's event.
*
*/
static void handle_switch_in(void *data, /* XXX: fill header */)
static void handle_switch(void *data, bool preempt, struct task_struct *p,
struct task_struct *n, unsigned int prev_state)
{
struct task_struct *p = /* XXX: how do I get p? */;
da_handle_event_wwnr(p, switch_in_wwnr);
}
/* start monitoring only after the first suspension */
if (prev_state == TASK_INTERRUPTIBLE)
da_handle_init_event_wwnr(p, switch_out_wwnr);
else
da_handle_event_wwnr(p, switch_out_wwnr);

static void handle_switch_out(void *data, /* XXX: fill header */)
{
struct task_struct *p = /* XXX: how do I get p? */;
da_handle_event_wwnr(p, switch_out_wwnr);
da_handle_event_wwnr(n, switch_in_wwnr);
}

static void handle_wakeup(void *data, /* XXX: fill header */)
static void handle_wakeup(void *data, struct task_struct *p)
{
struct task_struct *p = /* XXX: how do I get p? */;
da_handle_event_wwnr(p, wakeup_wwnr);
}

Expand All @@ -63,9 +59,8 @@ static int start_wwnr(void)
if (retval)
return retval;

rv_attach_trace_probe("wwnr", /* XXX: tracepoint */, handle_switch_in);
rv_attach_trace_probe("wwnr", /* XXX: tracepoint */, handle_switch_out);
rv_attach_trace_probe("wwnr", /* XXX: tracepoint */, handle_wakeup);
rv_attach_trace_probe("wwnr", sched_switch, handle_switch);
rv_attach_trace_probe("wwnr", sched_wakeup, handle_wakeup);

return 0;
}
Expand All @@ -74,9 +69,8 @@ static void stop_wwnr(void)
{
rv_wwnr.enabled = 0;

rv_detach_trace_probe("wwnr", /* XXX: tracepoint */, handle_switch_in);
rv_detach_trace_probe("wwnr", /* XXX: tracepoint */, handle_switch_out);
rv_detach_trace_probe("wwnr", /* XXX: tracepoint */, handle_wakeup);
rv_detach_trace_probe("wwnr", sched_switch, handle_switch);
rv_detach_trace_probe("wwnr", sched_wakeup, handle_wakeup);

da_monitor_destroy_wwnr();
}
Expand Down Expand Up @@ -111,5 +105,5 @@ module_init(register_wwnr);
module_exit(unregister_wwnr);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("dot2k: auto-generated");
MODULE_DESCRIPTION("wwnr");
MODULE_AUTHOR("Daniel Bristot de Oliveira <bristot@kernel.org>");
MODULE_DESCRIPTION("wwnr: wakeup while not running monitor.");

0 comments on commit 31dad66

Please sign in to comment.