Message ID | 944694879f67c0e635815ac57154be477a1b9108.1655368610.git.bristot@kernel.org (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | The Runtime Verification (RV) interface | expand |
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
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); > }
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.");
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(-)