Re: [PATCH V5 06/20] trace/osnoise: Allow multiple instances of the same tracer

From: Steven Rostedt
Date: Mon Oct 25 2021 - 22:09:03 EST


On Mon, 25 Oct 2021 19:40:31 +0200
Daniel Bristot de Oliveira <bristot@xxxxxxxxxx> wrote:

> kernel/trace/trace_osnoise.c | 101 +++++++++++++++++++++++++++--------
> 1 file changed, 78 insertions(+), 23 deletions(-)
>
> diff --git a/kernel/trace/trace_osnoise.c b/kernel/trace/trace_osnoise.c
> index 3db506f49a90..8681ffc3817b 100644
> --- a/kernel/trace/trace_osnoise.c
> +++ b/kernel/trace/trace_osnoise.c
> @@ -64,6 +64,24 @@ static bool osnoise_has_registered_instances(void)
> list);
> }
>
> +/*
> + * osnoise_instance_registered - check if a tr is already registered
> + */
> +static int osnoise_instance_registered(struct trace_array *tr)
> +{
> + struct osnoise_instance *inst;
> + int found = 0;
> +
> + rcu_read_lock();
> + list_for_each_entry_rcu(inst, &osnoise_instances, list) {
> + if (inst->tr == tr)
> + found = 1;
> + }
> + rcu_read_unlock();
> +
> + return found;
> +}
> +
> /*
> * osnoise_register_instance - register a new trace instance
> *
> @@ -2048,6 +2066,16 @@ static int osnoise_workload_start(void)
> {
> int retval;
>
> + /*
> + * Instances need to be registered after calling workload
> + * start. Hence, if there is already an instance, the
> + * workload was already registered. Otherwise, this
> + * code is on the way to register the first instance,
> + * and the workload will start.
> + */
> + if (osnoise_has_registered_instances())
> + return 0;

Looking at how this is checked before being called, it really should
return -1, as it is an error if this is called with instances active.

-- Steve

> +
> osn_var_reset_all();
>
> retval = osnoise_hook_events();
> @@ -2075,6 +2103,13 @@ static int osnoise_workload_start(void)
> */
> static void osnoise_workload_stop(void)
> {
> + /*
> + * Instances need to be unregistered before calling
> + * stop. Hence, if there is a registered instance, more
> + * than one instance is running, and the workload will not
> + * yet stop. Otherwise, this code is on the way to disable
> + * the last instance, and the workload can stop.
> + */
> if (osnoise_has_registered_instances())
> return;
>
> @@ -2096,7 +2131,11 @@ static void osnoise_tracer_start(struct trace_array *tr)
> {
> int retval;
>
> - if (osnoise_has_registered_instances())
> + /*
> + * If the instance is already registered, there is no need to
> + * register it again.
> + */
> + if (osnoise_instance_registered(tr))
> return;
>
> retval = osnoise_workload_start();