All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gabriele Monaco <gmonaco@redhat.com>
To: Nam Cao <namcao@linutronix.de>
Cc: Steven Rostedt <rostedt@goodmis.org>,
	Masami Hiramatsu <mhiramat@kernel.org>,
	 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
	linux-trace-kernel@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 4/6] rv: Remove rv_reactor's reference counter
Date: Mon, 21 Jul 2025 15:20:44 +0200	[thread overview]
Message-ID: <2de814842fbbeee888e076db2f80bf2028fdbb0d.camel@redhat.com> (raw)
In-Reply-To: <4ebe4d49e07890eadae41da233e111f8723fba12.1753091084.git.namcao@linutronix.de>

On Mon, 2025-07-21 at 11:47 +0200, Nam Cao wrote:
> rv_reactor has a reference counter to ensure it is not removed while
> monitors are still using it.
> 
> However, this is futile, as __exit functions are not expected to fail
> and
> will proceed normally despite rv_unregister_reactor() returning an
> error.
> 
> At the moment, reactors do not support being built as modules,
> therefore
> they are never removed and the reference counters are not necessary.
> 
> If we support building RV reactors as modules in the future,
> MODULE_SOFTDEP should be used instead of a custom implementation.
> 

Mmh, I'm not understanding how, let's assume I create a custom reactor
as a kernel module and I want to use it on existing models (built in or
modules themselves), I'd do.

 insmod myreactor
 echo myreactor > mymodel/reactors
 rmmod myreactor
 ## I want this one to fail because the reactor is in use

 echo nop > mymodel/reactors
 rmmod myreactor
 # now it can succeed

How is MODULE_SOFTDEP helping in this scenario?
Am I missing something here?

Thanks,
Gabriele

> Remove this reference counter.
> 
> Signed-off-by: Nam Cao <namcao@linutronix.de>
> ---
>  include/linux/rv.h            |  2 --
>  kernel/trace/rv/rv.c          |  1 -
>  kernel/trace/rv/rv.h          |  6 ------
>  kernel/trace/rv/rv_reactors.c | 33 ++-------------------------------
>  4 files changed, 2 insertions(+), 40 deletions(-)
> 
> diff --git a/include/linux/rv.h b/include/linux/rv.h
> index c22c9b8c1567..2f867d6f72ba 100644
> --- a/include/linux/rv.h
> +++ b/include/linux/rv.h
> @@ -91,8 +91,6 @@ struct rv_reactor {
>  	const char		*description;
>  	__printf(1, 2) void	(*react)(const char *msg, ...);
>  	struct list_head	list;
> -	/* protected by the monitor interface lock */
> -	int			counter;
>  };
>  #endif
>  
> diff --git a/kernel/trace/rv/rv.c b/kernel/trace/rv/rv.c
> index 6c0be2fdc52d..6c8498743b98 100644
> --- a/kernel/trace/rv/rv.c
> +++ b/kernel/trace/rv/rv.c
> @@ -769,7 +769,6 @@ static const struct file_operations
> monitoring_on_fops = {
>  
>  static void destroy_monitor_dir(struct rv_monitor *mon)
>  {
> -	reactor_cleanup_monitor(mon);
>  	rv_remove(mon->root_d);
>  }
>  
> diff --git a/kernel/trace/rv/rv.h b/kernel/trace/rv/rv.h
> index 8c38f9dd41bc..1485a70c1bf4 100644
> --- a/kernel/trace/rv/rv.h
> +++ b/kernel/trace/rv/rv.h
> @@ -31,7 +31,6 @@ bool rv_is_nested_monitor(struct rv_monitor *mon);
>  
>  #ifdef CONFIG_RV_REACTORS
>  int reactor_populate_monitor(struct rv_monitor *mon);
> -void reactor_cleanup_monitor(struct rv_monitor *mon);
>  int init_rv_reactors(struct dentry *root_dir);
>  #else
>  static inline int reactor_populate_monitor(struct rv_monitor *mon)
> @@ -39,11 +38,6 @@ static inline int reactor_populate_monitor(struct
> rv_monitor *mon)
>  	return 0;
>  }
>  
> -static inline void reactor_cleanup_monitor(struct rv_monitor *mon)
> -{
> -	return;
> -}
> -
>  static inline int init_rv_reactors(struct dentry *root_dir)
>  {
>  	return 0;
> diff --git a/kernel/trace/rv/rv_reactors.c
> b/kernel/trace/rv/rv_reactors.c
> index 2c7909e6d0e7..a8e849e6cd85 100644
> --- a/kernel/trace/rv/rv_reactors.c
> +++ b/kernel/trace/rv/rv_reactors.c
> @@ -172,10 +172,6 @@ static void monitor_swap_reactors_single(struct
> rv_monitor *mon,
>  	if (monitor_enabled)
>  		rv_disable_monitor(mon);
>  
> -	/* swap reactor's usage */
> -	mon->reactor->counter--;
> -	reactor->counter++;
> -
>  	mon->reactor = reactor;
>  	mon->reacting = reacting;
>  	mon->react = reactor->react;
> @@ -343,23 +339,10 @@ int rv_register_reactor(struct rv_reactor
> *reactor)
>   */
>  int rv_unregister_reactor(struct rv_reactor *reactor)
>  {
> -	int ret = 0;
> -
>  	mutex_lock(&rv_interface_lock);
> -
> -	if (!reactor->counter) {
> -		list_del(&reactor->list);
> -	} else {
> -		printk(KERN_WARNING
> -		       "rv: the rv_reactor %s is in use by %d
> monitor(s)\n",
> -		       reactor->name, reactor->counter);
> -		printk(KERN_WARNING "rv: the rv_reactor %s cannot be
> removed\n",
> -		       reactor->name);
> -		ret = -EBUSY;
> -	}
> -
> +	list_del(&reactor->list);
>  	mutex_unlock(&rv_interface_lock);
> -	return ret;
> +	return 0;
>  }
>  
>  /*
> @@ -456,23 +439,11 @@ int reactor_populate_monitor(struct rv_monitor
> *mon)
>  	 * Configure as the rv_nop reactor.
>  	 */
>  	mon->reactor = get_reactor_rdef_by_name("nop");
> -	mon->reactor->counter++;
>  	mon->reacting = false;
>  
>  	return 0;
>  }
>  
> -/**
> - * reactor_cleanup_monitor - cleanup a monitor reference
> - * @mon:       the monitor.
> - */
> -void reactor_cleanup_monitor(struct rv_monitor *mon)
> -{
> -	lockdep_assert_held(&rv_interface_lock);
> -	mon->reactor->counter--;
> -	WARN_ON_ONCE(mon->reactor->counter < 0);
> -}
> -
>  /*
>   * Nop reactor register
>   */


  reply	other threads:[~2025-07-21 13:20 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-07-21  9:47 [PATCH 0/6] rv: Clean up & simplify Nam Cao
2025-07-21  9:47 ` [PATCH 1/6] rv: Remove unused field in struct rv_monitor_def Nam Cao
2025-07-21 13:01   ` Gabriele Monaco
2025-07-21  9:47 ` [PATCH 2/6] rv: Merge struct rv_monitor_def into struct rv_monitor Nam Cao
2025-07-21 14:13   ` Gabriele Monaco
2025-07-21  9:47 ` [PATCH 3/6] rv: Merge struct rv_reactor_def into struct rv_reactor Nam Cao
2025-07-21 14:29   ` Gabriele Monaco
2025-07-21  9:47 ` [PATCH 4/6] rv: Remove rv_reactor's reference counter Nam Cao
2025-07-21 13:20   ` Gabriele Monaco [this message]
2025-07-21 14:04     ` Nam Cao
2025-07-21 15:49       ` Gabriele Monaco
2025-07-22  8:27         ` Nam Cao
2025-07-22  8:30           ` Gabriele Monaco
2025-07-21  9:47 ` [PATCH 5/6] rv: Remove the nop reactor Nam Cao
2025-07-21 10:29   ` Gabriele Monaco
2025-07-21 14:10     ` Nam Cao
2025-07-21  9:47 ` [PATCH 6/6] rv: Remove struct rv_monitor::reacting Nam Cao
2025-07-21 14:38   ` Gabriele Monaco

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=2de814842fbbeee888e076db2f80bf2028fdbb0d.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 \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.