linux-trace-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Gabriele Monaco <gmonaco@redhat.com>
To: "Thomas Weißschuh" <thomas.weissschuh@linutronix.de>,
	"Steven Rostedt" <rostedt@goodmis.org>,
	"Masami Hiramatsu" <mhiramat@kernel.org>,
	"Mathieu Desnoyers" <mathieu.desnoyers@efficios.com>,
	"Nam Cao" <namcao@linutronix.de>
Cc: linux-trace-kernel@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 1/3] rv: Pass va_list to reactors
Date: Tue, 14 Oct 2025 09:08:10 +0200	[thread overview]
Message-ID: <704a58272bb9071d31488c1e12d508914dc391a5.camel@redhat.com> (raw)
In-Reply-To: <20251014-rv-lockdep-v1-1-0b9e51919ea8@linutronix.de>

On Tue, 2025-10-14 at 07:51 +0200, Thomas Weißschuh wrote:
> The only thing the reactors can do with the passed in varargs is to
> convert it into a va_list. Do that in a central helper instead.
> It simplifies the reactors, removes some hairy macro-generated code
> and introduces a convenient hook point to modify reactor behavior.
> 
> Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
> ---
> --- a/include/rv/da_monitor.h
> +++ b/include/rv/da_monitor.h
> @@ -16,34 +16,19 @@
>  #include <linux/bug.h>
>  #include <linux/sched.h>
>  
> -#ifdef CONFIG_RV_REACTORS
> -
> -#define DECLARE_RV_REACTING_HELPERS(name,
> type)							\
> -static void cond_react_##name(type curr_state, type
> event)					\
> -
> {												\
> -	if (!rv_reacting_on() ||
> !rv_##name.react)						\
> -
> 		return;										\
> -	rv_##name.react("rv: monitor %s does not allow event %s on state
> %s\n",			\
> -
> 			#name,									\
> -
> 			model_get_event_name_##name(event),					\
> -
> 			model_get_state_name_##name(curr_state));				\
> -}
> -

The overall change looks good to me, just keep in mind there is an ongoing
refactor [1] for the da_monitor header to get rid of those macros, basically
making it more similar to the current ltl.
Depending on which gets merged first, you may need some (trivial) adaptation of
this.

Going to test it out more carefully in the next days.

Thanks,
Gabriele

[1] - https://lore.kernel.org/lkml/20250919140954.104920-1-gmonaco@redhat.com

> -#else /* CONFIG_RV_REACTOR */
> -
> -#define DECLARE_RV_REACTING_HELPERS(name,
> type)							\
> -static void cond_react_##name(type curr_state, type
> event)					\
> -
> {												\
> -
> 	return;											\
> -}
> -#endif
> -
>  /*
>   * Generic helpers for all types of deterministic automata monitors.
>   */
>  #define DECLARE_DA_MON_GENERIC_HELPERS(name,
> type)						\
>  									
> 			\
> -DECLARE_RV_REACTING_HELPERS(name,
> type)								\
> +static void react_##name(type curr_state, type
> event)						\
> +{									
> 			\
> +	rv_react(&rv_##name,						
> 			\
> +		 "rv: monitor %s does not allow event %s on state
> %s\n",			\
> +		
> #name,										\
> +		
> model_get_event_name_##name(event),						\
> +		
> model_get_state_name_##name(curr_state));					\
> +}									
> 			\
>  									
> 			\
>  /*									
> 			\
>   * da_monitor_reset_##name - reset a monitor and setting it to init
> state			\
> @@ -126,7 +111,7 @@ da_event_##name(struct da_monitor *da_mon, enum
> events_##name event)				\
>  	for (int i = 0; i < MAX_DA_RETRY_RACING_EVENTS; i++)
> {					\
>  		next_state = model_get_next_state_##name(curr_state,
> event);			\
>  		if (next_state == INVALID_STATE)
> {						\
> -			cond_react_##name(curr_state,
> event);					\
> +			react_##name(curr_state,
> event);					\
>  			trace_error_##name(model_get_state_name_##name(curr_s
> tate),		\
>  					  
> model_get_event_name_##name(event));			\
>  			return
> false;								\
> @@ -165,7 +150,7 @@ static inline bool da_event_##name(struct da_monitor
> *da_mon, struct task_struct
>  	for (int i = 0; i < MAX_DA_RETRY_RACING_EVENTS; i++)
> {					\
>  		next_state = model_get_next_state_##name(curr_state,
> event);			\
>  		if (next_state == INVALID_STATE)
> {						\
> -			cond_react_##name(curr_state,
> event);					\
> +			react_##name(curr_state,
> event);					\
>  			trace_error_##name(tsk-
> >pid,						\
>  					  
> model_get_state_name_##name(curr_state),		\
>  					  
> model_get_event_name_##name(event));			\
> diff --git a/include/rv/ltl_monitor.h b/include/rv/ltl_monitor.h
> index
> 5368cf5fd623e74a5739d2e0b3fc2c27c4bad597..00c42b36f961a00ee473aa58f14b01530852
> 3eb0 100644
> --- a/include/rv/ltl_monitor.h
> +++ b/include/rv/ltl_monitor.h
> @@ -16,21 +16,12 @@
>  #error "Please include $(MODEL_NAME).h generated by rvgen"
>  #endif
>  
> -#ifdef CONFIG_RV_REACTORS
>  #define RV_MONITOR_NAME CONCATENATE(rv_, MONITOR_NAME)
> -static struct rv_monitor RV_MONITOR_NAME;
>  
> -static void rv_cond_react(struct task_struct *task)
> -{
> -	if (!rv_reacting_on() || !RV_MONITOR_NAME.react)
> -		return;
> -	RV_MONITOR_NAME.react("rv: "__stringify(MONITOR_NAME)": %s[%d]:
> violation detected\n",
> -			      task->comm, task->pid);
> -}
> +#ifdef CONFIG_RV_REACTORS
> +static struct rv_monitor RV_MONITOR_NAME;
>  #else
> -static void rv_cond_react(struct task_struct *task)
> -{
> -}
> +extern struct rv_monitor RV_MONITOR_NAME;
>  #endif
>  
>  static int ltl_monitor_slot = RV_PER_TASK_MONITOR_INIT;
> @@ -98,7 +89,8 @@ static void ltl_monitor_destroy(void)
>  static void ltl_illegal_state(struct task_struct *task, struct ltl_monitor
> *mon)
>  {
>  	CONCATENATE(trace_error_, MONITOR_NAME)(task);
> -	rv_cond_react(task);
> +	rv_react(&RV_MONITOR_NAME, "rv: "__stringify(MONITOR_NAME)": %s[%d]:
> violation detected\n",
> +		 task->comm, task->pid);
>  }
>  
>  static void ltl_attempt_start(struct task_struct *task, struct ltl_monitor
> *mon)
> diff --git a/kernel/trace/rv/reactor_panic.c b/kernel/trace/rv/reactor_panic.c
> index
> 74c6bcc2c7494408770881dda2b0de885c5eb88c..76537b8a4343cbd0d715f60db3cc8868e71c
> 1c0b 100644
> --- a/kernel/trace/rv/reactor_panic.c
> +++ b/kernel/trace/rv/reactor_panic.c
> @@ -13,13 +13,9 @@
>  #include <linux/init.h>
>  #include <linux/rv.h>
>  
> -__printf(1, 2) static void rv_panic_reaction(const char *msg, ...)
> +__printf(1, 0) static void rv_panic_reaction(const char *msg, va_list args)
>  {
> -	va_list args;
> -
> -	va_start(args, msg);
>  	vpanic(msg, args);
> -	va_end(args);
>  }
>  
>  static struct rv_reactor rv_panic = {
> diff --git a/kernel/trace/rv/reactor_printk.c
> b/kernel/trace/rv/reactor_printk.c
> index
> 2dae2916c05fd17397195e37d9b42d24cea24b9c..48c934e315b31c14d3a5b4fa3ec334ef71f9
> e390 100644
> --- a/kernel/trace/rv/reactor_printk.c
> +++ b/kernel/trace/rv/reactor_printk.c
> @@ -12,13 +12,9 @@
>  #include <linux/init.h>
>  #include <linux/rv.h>
>  
> -__printf(1, 2) static void rv_printk_reaction(const char *msg, ...)
> +__printf(1, 0) static void rv_printk_reaction(const char *msg, va_list args)
>  {
> -	va_list args;
> -
> -	va_start(args, msg);
>  	vprintk_deferred(msg, args);
> -	va_end(args);
>  }
>  
>  static struct rv_reactor rv_printk = {
> diff --git a/kernel/trace/rv/rv_reactors.c b/kernel/trace/rv/rv_reactors.c
> index
> d32859fec238371b5721e08cf6558f0805565f7b..cb1a5968055abb22439a066b4e25dad98f07
> 8389 100644
> --- a/kernel/trace/rv/rv_reactors.c
> +++ b/kernel/trace/rv/rv_reactors.c
> @@ -438,7 +438,7 @@ int reactor_populate_monitor(struct rv_monitor *mon)
>  /*
>   * Nop reactor register
>   */
> -__printf(1, 2) static void rv_nop_reaction(const char *msg, ...)
> +__printf(1, 0) static void rv_nop_reaction(const char *msg, va_list args)
>  {
>  }
>  
> @@ -477,3 +477,17 @@ int init_rv_reactors(struct dentry *root_dir)
>  out_err:
>  	return -ENOMEM;
>  }
> +
> +void rv_react(struct rv_monitor *monitor, const char *msg, ...)
> +{
> +	va_list args;
> +
> +	if (!rv_reacting_on() || !monitor->react)
> +		return;
> +
> +	va_start(args, msg);
> +
> +	monitor->react(msg, args);
> +
> +	va_end(args);
> +}


  reply	other threads:[~2025-10-14  7:08 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-10-14  5:51 [PATCH 0/3] rv: Add explicit lockdep context for reactors Thomas Weißschuh
2025-10-14  5:51 ` [PATCH 1/3] rv: Pass va_list to reactors Thomas Weißschuh
2025-10-14  7:08   ` Gabriele Monaco [this message]
2025-10-14  5:51 ` [PATCH 2/3] rv: Make rv_reacting_on() static Thomas Weißschuh
2025-10-14  5:51 ` [PATCH 3/3] rv: Add explicit lockdep context for reactors Thomas Weißschuh
2025-10-14  6:55   ` Gabriele Monaco
2025-10-14  7:13     ` Thomas Weißschuh
2025-10-14  7:38   ` Nam Cao
2025-10-14  9:46     ` Thomas Weißschuh
2025-10-14 10:22       ` Gabriele Monaco
2025-10-14 12:51         ` Thomas Weißschuh
2025-10-14 13:45           ` Gabriele Monaco
2025-10-14 14:18             ` Thomas Weißschuh
2025-10-14 14:50               ` Gabriele Monaco
2025-10-15 10:07                 ` Thomas Weißschuh

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=704a58272bb9071d31488c1e12d508914dc391a5.camel@redhat.com \
    --to=gmonaco@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-trace-kernel@vger.kernel.org \
    --cc=mathieu.desnoyers@efficios.com \
    --cc=mhiramat@kernel.org \
    --cc=namcao@linutronix.de \
    --cc=rostedt@goodmis.org \
    --cc=thomas.weissschuh@linutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).