[RFC V3 11/20] rv/monitor: wwnr instrumentation and Makefile/Kconfig entries

From: Daniel Bristot de Oliveira
Date: Thu May 05 2022 - 12:08:41 EST


Adds the instrumentation to the previously created wwnr monitor, as an
example of the developer work. It also adds a Makefile and Kconfig
entries.

Cc: Jonathan Corbet <corbet@xxxxxxx>
Cc: Steven Rostedt <rostedt@xxxxxxxxxxx>
Cc: Ingo Molnar <mingo@xxxxxxxxxx>
Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
Cc: Peter Zijlstra <peterz@xxxxxxxxxxxxx>
Cc: Will Deacon <will@xxxxxxxxxx>
Cc: Catalin Marinas <catalin.marinas@xxxxxxx>
Cc: Marco Elver <elver@xxxxxxxxxx>
Cc: Dmitry Vyukov <dvyukov@xxxxxxxxxx>
Cc: "Paul E. McKenney" <paulmck@xxxxxxxxxx>
Cc: Shuah Khan <skhan@xxxxxxxxxxxxxxxxxxx>
Cc: Gabriele Paoloni <gpaoloni@xxxxxxxxxx>
Cc: Juri Lelli <juri.lelli@xxxxxxxxxx>
Cc: Clark Williams <williams@xxxxxxxxxx>
Cc: linux-doc@xxxxxxxxxxxxxxx
Cc: linux-kernel@xxxxxxxxxxxxxxx
Cc: linux-trace-devel@xxxxxxxxxxxxxxx
Signed-off-by: Daniel Bristot de Oliveira <bristot@xxxxxxxxxx>
---
kernel/trace/rv/Kconfig | 7 ++++++
kernel/trace/rv/Makefile | 1 +
kernel/trace/rv/monitor_wwnr/wwnr.c | 38 ++++++++++++-----------------
kernel/trace/rv/monitor_wwnr/wwnr.h | 2 +-
4 files changed, 24 insertions(+), 24 deletions(-)

diff --git a/kernel/trace/rv/Kconfig b/kernel/trace/rv/Kconfig
index f2549cdd2de8..101d565cb53d 100644
--- a/kernel/trace/rv/Kconfig
+++ b/kernel/trace/rv/Kconfig
@@ -20,6 +20,13 @@ 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
+ 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
diff --git a/kernel/trace/rv/Makefile b/kernel/trace/rv/Makefile
index 20f30741b933..edad01bb2b5d 100644
--- a/kernel/trace/rv/Makefile
+++ b/kernel/trace/rv/Makefile
@@ -3,3 +3,4 @@
obj-$(CONFIG_RV) += rv.o
obj-$(CONFIG_RV_REACTORS) += rv_reactors.o
obj-$(CONFIG_RV_MON_WIP) += monitor_wip/wip.o
+obj-$(CONFIG_RV_MON_WWNR) += monitor_wwnr/wwnr.o
diff --git a/kernel/trace/rv/monitor_wwnr/wwnr.c b/kernel/trace/rv/monitor_wwnr/wwnr.c
index 1ad3365c0d22..7a4b004ac311 100644
--- a/kernel/trace/rv/monitor_wwnr/wwnr.c
+++ b/kernel/trace/rv/monitor_wwnr/wwnr.c
@@ -8,12 +8,9 @@
#include <rv/instrumentation.h>
#include <rv/da_monitor.h>

-#define MODULE_NAME "wwnr"
+#include <trace/events/sched.h>

-/*
- * XXX: include required tracepoint headers, e.g.,
- * #include <linux/trace/events/sched.h>
- */
+#define MODULE_NAME "wwnr"

/*
* This is the self-generated part of the monitor. Generally, there is no need
@@ -39,25 +36,22 @@ 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, unsigned int prev_state, struct task_struct *p, struct task_struct *n)
{
- struct task_struct *p = /* XXX: how do I get p? */;
- da_handle_event_wwnr(p, switch_in);
-}
+ /* start monitoring only after the first suspension */
+ if (prev_state == TASK_INTERRUPTIBLE)
+ da_handle_init_event_wwnr(p, switch_out);
+ else
+ da_handle_event_wwnr(p, switch_out);

-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);
+ da_handle_event_wwnr(n, switch_in);
}

-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);
}

-
static int start_wwnr(void)
{
int retval;
@@ -66,9 +60,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;
}
@@ -77,9 +70,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();
}
@@ -89,7 +81,7 @@ static void stop_wwnr(void)
*/
struct rv_monitor rv_wwnr = {
.name = "wwnr",
- .description = "auto-generated wwnr",
+ .description = "wwnr: wakeup while not running: per-task sample monitor.",
.start = start_wwnr,
.stop = stop_wwnr,
.reset = da_monitor_reset_all_wwnr,
diff --git a/kernel/trace/rv/monitor_wwnr/wwnr.h b/kernel/trace/rv/monitor_wwnr/wwnr.h
index 4af1827d2f16..387f5a83ee7c 100644
--- a/kernel/trace/rv/monitor_wwnr/wwnr.h
+++ b/kernel/trace/rv/monitor_wwnr/wwnr.h
@@ -65,6 +65,6 @@ TRACE_EVENT(error_wwnr,

/* This part ust be outside protection */
#undef TRACE_INCLUDE_PATH
-#define TRACE_INCLUDE_PATH .
+#define TRACE_INCLUDE_PATH ../kernel/trace/rv/monitor_wwnr/
#define TRACE_INCLUDE_FILE wwnr
#include <trace/define_trace.h>
--
2.35.1