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>
---
include/trace/events/rv.h | 12 +++++++++
kernel/trace/rv/Kconfig | 8 ++++++
kernel/trace/rv/Makefile | 1 +
kernel/trace/rv/monitors/wwnr/wwnr.c | 38 ++++++++++++----------------
4 files changed, 37 insertions(+), 22 deletions(-)
diff --git a/include/trace/events/rv.h b/include/trace/events/rv.h
index 4e0dabffcf29..00f11a8dac3b 100644
--- a/include/trace/events/rv.h
+++ b/include/trace/events/rv.h
@@ -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 */
diff --git a/kernel/trace/rv/Kconfig b/kernel/trace/rv/Kconfig
index e9246b0bec9d..fba2ace2a22b 100644
--- a/kernel/trace/rv/Kconfig
+++ b/kernel/trace/rv/Kconfig
@@ -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
diff --git a/kernel/trace/rv/Makefile b/kernel/trace/rv/Makefile
index b41109d2750a..af0ff9a46418 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) += monitors/wip/wip.o
+obj-$(CONFIG_RV_MON_WWNR) += monitors/wwnr/wwnr.o
diff --git a/kernel/trace/rv/monitors/wwnr/wwnr.c b/kernel/trace/rv/monitors/wwnr/wwnr.c
index 8ba01f0f0df8..3fe1ad9125d3 100644
--- a/kernel/trace/rv/monitors/wwnr/wwnr.c
+++ b/kernel/trace/rv/monitors/wwnr/wwnr.c
@@ -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
@@ -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);
}
@@ -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;
}
@@ -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();
}
@@ -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.");
--
2.35.1
On Thu, 16 Jun 2022 10:44:53 +0200
Daniel Bristot de Oliveira <bristot@kernel.org> wrote:
> diff --git a/kernel/trace/rv/monitors/wwnr/wwnr.c b/kernel/trace/rv/monitors/wwnr/wwnr.c
> index 8ba01f0f0df8..3fe1ad9125d3 100644
> --- a/kernel/trace/rv/monitors/wwnr/wwnr.c
> +++ b/kernel/trace/rv/monitors/wwnr/wwnr.c
> @@ -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
> @@ -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)
> {
Patch 8 was the "educational" patch. There's no reason to split 10 and 11
up too.
-- Steve
> - 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);
> }
Hi Daniel,
I love your patch! Perhaps something to improve:
[auto build test WARNING on rostedt-trace/for-next]
[also build test WARNING on tip/sched/core]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/intel-lab-lkp/linux/commits/Daniel-Bristot-de-Oliveira/The-Runtime-Verification-RV-interface/20220616-164837
base: https://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace.git for-next
config: x86_64-allyesconfig (https://download.01.org/0day-ci/archive/20220616/202206162130.0xtEgymS-lkp@intel.com/config)
compiler: gcc-11 (Debian 11.3.0-3) 11.3.0
reproduce (this is a W=1 build):
# https://github.com/intel-lab-lkp/linux/commit/31dad6685057c10f6301fbc4018b6586fce0757e
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Daniel-Bristot-de-Oliveira/The-Runtime-Verification-RV-interface/20220616-164837
git checkout 31dad6685057c10f6301fbc4018b6586fce0757e
# save the config file
mkdir build_dir && cp config build_dir/.config
make W=1 O=build_dir ARCH=x86_64 SHELL=/bin/bash kernel/trace/rv/
If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>
All warnings (new ones prefixed by >>):
In file included from kernel/trace/rv/monitors/wwnr/wwnr.c:8:
kernel/trace/rv/monitors/wwnr/wwnr.c: In function 'start_wwnr':
kernel/trace/rv/monitors/wwnr/wwnr.c:62:53: error: passing argument 1 of 'check_trace_callback_type_sched_switch' from incompatible pointer type [-Werror=incompatible-pointer-types]
62 | rv_attach_trace_probe("wwnr", sched_switch, handle_switch);
| ^~~~~~~~~~~~~
| |
| void (*)(void *, bool, struct task_struct *, struct task_struct *, unsigned int) {aka void (*)(void *, _Bool, struct task_struct *, struct task_struct *, unsigned int)}
include/rv/instrumentation.h:15:48: note: in definition of macro 'rv_attach_trace_probe'
15 | check_trace_callback_type_##tp(rv_handler); \
| ^~~~~~~~~~
In file included from kernel/trace/rv/monitors/wwnr/wwnr.c:3:
include/linux/tracepoint.h:279:49: note: expected 'void (*)(void *, bool, unsigned int, struct task_struct *, struct task_struct *)' {aka 'void (*)(void *, _Bool, unsigned int, struct task_struct *, struct task_struct *)'} but argument is of type 'void (*)(void *, bool, struct task_struct *, struct task_struct *, unsigned int)' {aka 'void (*)(void *, _Bool, struct task_struct *, struct task_struct *, unsigned int)'}
279 | check_trace_callback_type_##name(void (*cb)(data_proto)) \
| ~~~~~~~^~~~~~~~~~~~~~~
include/linux/tracepoint.h:419:9: note: in expansion of macro '__DECLARE_TRACE'
419 | __DECLARE_TRACE(name, PARAMS(proto), PARAMS(args), \
| ^~~~~~~~~~~~~~~
include/linux/tracepoint.h:553:9: note: in expansion of macro 'DECLARE_TRACE'
553 | DECLARE_TRACE(name, PARAMS(proto), PARAMS(args))
| ^~~~~~~~~~~~~
include/trace/events/sched.h:222:1: note: in expansion of macro 'TRACE_EVENT'
222 | TRACE_EVENT(sched_switch,
| ^~~~~~~~~~~
In file included from include/linux/printk.h:11,
from include/linux/kernel.h:29,
from include/linux/interrupt.h:6,
from include/linux/trace_recursion.h:5,
from include/linux/ftrace.h:10,
from kernel/trace/rv/monitors/wwnr/wwnr.c:2:
kernel/trace/rv/monitors/wwnr/wwnr.c:62:53: error: passing argument 1 of 'register_trace_sched_switch' from incompatible pointer type [-Werror=incompatible-pointer-types]
62 | rv_attach_trace_probe("wwnr", sched_switch, handle_switch);
| ^~~~~~~~~~~~~
| |
| void (*)(void *, bool, struct task_struct *, struct task_struct *, unsigned int) {aka void (*)(void *, _Bool, struct task_struct *, struct task_struct *, unsigned int)}
include/linux/once_lite.h:15:41: note: in definition of macro 'DO_ONCE_LITE_IF'
15 | bool __ret_do_once = !!(condition); \
| ^~~~~~~~~
include/rv/instrumentation.h:16:17: note: in expansion of macro 'WARN_ONCE'
16 | WARN_ONCE(register_trace_##tp(rv_handler, NULL), \
| ^~~~~~~~~
kernel/trace/rv/monitors/wwnr/wwnr.c:62:9: note: in expansion of macro 'rv_attach_trace_probe'
62 | rv_attach_trace_probe("wwnr", sched_switch, handle_switch);
| ^~~~~~~~~~~~~~~~~~~~~
In file included from kernel/trace/rv/monitors/wwnr/wwnr.c:3:
include/linux/tracepoint.h:260:38: note: expected 'void (*)(void *, bool, unsigned int, struct task_struct *, struct task_struct *)' {aka 'void (*)(void *, _Bool, unsigned int, struct task_struct *, struct task_struct *)'} but argument is of type 'void (*)(void *, bool, struct task_struct *, struct task_struct *, unsigned int)' {aka 'void (*)(void *, _Bool, struct task_struct *, struct task_struct *, unsigned int)'}
260 | register_trace_##name(void (*probe)(data_proto), void *data) \
| ~~~~~~~^~~~~~~~~~~~~~~~~~
include/linux/tracepoint.h:419:9: note: in expansion of macro '__DECLARE_TRACE'
419 | __DECLARE_TRACE(name, PARAMS(proto), PARAMS(args), \
| ^~~~~~~~~~~~~~~
include/linux/tracepoint.h:553:9: note: in expansion of macro 'DECLARE_TRACE'
553 | DECLARE_TRACE(name, PARAMS(proto), PARAMS(args))
| ^~~~~~~~~~~~~
include/trace/events/sched.h:222:1: note: in expansion of macro 'TRACE_EVENT'
222 | TRACE_EVENT(sched_switch,
| ^~~~~~~~~~~
In file included from kernel/trace/rv/monitors/wwnr/wwnr.c:8:
kernel/trace/rv/monitors/wwnr/wwnr.c: In function 'stop_wwnr':
kernel/trace/rv/monitors/wwnr/wwnr.c:72:53: error: passing argument 1 of 'unregister_trace_sched_switch' from incompatible pointer type [-Werror=incompatible-pointer-types]
72 | rv_detach_trace_probe("wwnr", sched_switch, handle_switch);
| ^~~~~~~~~~~~~
| |
| void (*)(void *, bool, struct task_struct *, struct task_struct *, unsigned int) {aka void (*)(void *, _Bool, struct task_struct *, struct task_struct *, unsigned int)}
include/rv/instrumentation.h:22:39: note: in definition of macro 'rv_detach_trace_probe'
22 | unregister_trace_##tp(rv_handler, NULL); \
| ^~~~~~~~~~
In file included from kernel/trace/rv/monitors/wwnr/wwnr.c:3:
include/linux/tracepoint.h:273:40: note: expected 'void (*)(void *, bool, unsigned int, struct task_struct *, struct task_struct *)' {aka 'void (*)(void *, _Bool, unsigned int, struct task_struct *, struct task_struct *)'} but argument is of type 'void (*)(void *, bool, struct task_struct *, struct task_struct *, unsigned int)' {aka 'void (*)(void *, _Bool, struct task_struct *, struct task_struct *, unsigned int)'}
273 | unregister_trace_##name(void (*probe)(data_proto), void *data) \
| ~~~~~~~^~~~~~~~~~~~~~~~~~
include/linux/tracepoint.h:419:9: note: in expansion of macro '__DECLARE_TRACE'
419 | __DECLARE_TRACE(name, PARAMS(proto), PARAMS(args), \
| ^~~~~~~~~~~~~~~
include/linux/tracepoint.h:553:9: note: in expansion of macro 'DECLARE_TRACE'
553 | DECLARE_TRACE(name, PARAMS(proto), PARAMS(args))
| ^~~~~~~~~~~~~
include/trace/events/sched.h:222:1: note: in expansion of macro 'TRACE_EVENT'
222 | TRACE_EVENT(sched_switch,
| ^~~~~~~~~~~
kernel/trace/rv/monitors/wwnr/wwnr.c: At top level:
>> kernel/trace/rv/monitors/wwnr/wwnr.c:90:5: warning: no previous prototype for 'register_wwnr' [-Wmissing-prototypes]
90 | int register_wwnr(void)
| ^~~~~~~~~~~~~
>> kernel/trace/rv/monitors/wwnr/wwnr.c:96:6: warning: no previous prototype for 'unregister_wwnr' [-Wmissing-prototypes]
96 | void unregister_wwnr(void)
| ^~~~~~~~~~~~~~~
cc1: some warnings being treated as errors
vim +/register_wwnr +90 kernel/trace/rv/monitors/wwnr/wwnr.c
13d11b21732323 Daniel Bristot de Oliveira 2022-06-16 89
13d11b21732323 Daniel Bristot de Oliveira 2022-06-16 @90 int register_wwnr(void)
13d11b21732323 Daniel Bristot de Oliveira 2022-06-16 91 {
13d11b21732323 Daniel Bristot de Oliveira 2022-06-16 92 rv_register_monitor(&rv_wwnr);
13d11b21732323 Daniel Bristot de Oliveira 2022-06-16 93 return 0;
13d11b21732323 Daniel Bristot de Oliveira 2022-06-16 94 }
13d11b21732323 Daniel Bristot de Oliveira 2022-06-16 95
13d11b21732323 Daniel Bristot de Oliveira 2022-06-16 @96 void unregister_wwnr(void)
13d11b21732323 Daniel Bristot de Oliveira 2022-06-16 97 {
13d11b21732323 Daniel Bristot de Oliveira 2022-06-16 98 if (rv_wwnr.enabled)
13d11b21732323 Daniel Bristot de Oliveira 2022-06-16 99 stop_wwnr();
13d11b21732323 Daniel Bristot de Oliveira 2022-06-16 100
13d11b21732323 Daniel Bristot de Oliveira 2022-06-16 101 rv_unregister_monitor(&rv_wwnr);
13d11b21732323 Daniel Bristot de Oliveira 2022-06-16 102 }
13d11b21732323 Daniel Bristot de Oliveira 2022-06-16 103
--
0-DAY CI Kernel Test Service
https://01.org/lkp
© 2016 - 2025 Red Hat, Inc.