From: Daniel Bristot de Oliveira <bristot@kernel.org>
To: Steven Rostedt <rostedt@goodmis.org>
Cc: Daniel Bristot de Oliveira <bristot@kernel.org>,
Ingo Molnar <mingo@redhat.com>, Tom Zanussi <zanussi@kernel.org>,
Masami Hiramatsu <mhiramat@kernel.org>,
Juri Lelli <juri.lelli@redhat.com>,
Clark Williams <williams@redhat.com>,
John Kacur <jkacur@redhat.com>,
Peter Zijlstra <peterz@infradead.org>,
Thomas Gleixner <tglx@linutronix.de>,
Sebastian Andrzej Siewior <bigeasy@linutronix.de>,
linux-rt-users@vger.kernel.org,
linux-trace-devel@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH V3 05/19] trace/osnoise: Allow multiple instances of the same tracer
Date: Mon, 18 Oct 2021 18:48:18 +0200 [thread overview]
Message-ID: <c9809c7e80a5dba6f667101951dfa5d2db83b95a.1634574261.git.bristot@kernel.org> (raw)
In-Reply-To: <cover.1634574261.git.bristot@kernel.org>
Allow more than one instance of the same tracer. The workload will
start when the first trace_array (instance) is registered and will
stop when the last instance is unregistered.
Osnoise and timerlat are still mutually exclusive because of the
different behavior of the osnoise: tracepoints.
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Tom Zanussi <zanussi@kernel.org>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Juri Lelli <juri.lelli@redhat.com>
Cc: Clark Williams <williams@redhat.com>
Cc: John Kacur <jkacur@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Cc: Daniel Bristot de Oliveira <bristot@kernel.org>
Cc: linux-rt-users@vger.kernel.org
Cc: linux-trace-devel@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Daniel Bristot de Oliveira <bristot@kernel.org>
---
kernel/trace/trace_osnoise.c | 106 ++++++++++++++++++++++++++---------
1 file changed, 80 insertions(+), 26 deletions(-)
diff --git a/kernel/trace/trace_osnoise.c b/kernel/trace/trace_osnoise.c
index a6d8f514bd7c..f913964f6861 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
*
@@ -106,10 +124,8 @@ static void osnoise_unregister_instance(struct trace_array *tr)
}
rcu_read_unlock();
- if (!found) {
- WARN("osnoise unregister did not find tr %s\n", tr->name);
+ if (!found)
return;
- }
synchronize_rcu();
kfree(inst);
@@ -1190,6 +1206,7 @@ static __always_inline void osnoise_stop_tracing(void)
"stop tracing hit on cpu %d\n", smp_processor_id());
tracer_tracing_off(tr);
+
}
rcu_read_unlock();
}
@@ -2041,6 +2058,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;
+
osn_var_reset_all();
retval = osnoise_hook_events();
@@ -2066,6 +2093,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;
@@ -2083,7 +2117,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();
@@ -2095,18 +2133,17 @@ static void osnoise_tracer_start(struct trace_array *tr)
static void osnoise_tracer_stop(struct trace_array *tr)
{
- if (!osnoise_has_registered_instances())
- return;
-
osnoise_unregister_instance(tr);
osnoise_workload_stop();
}
static int osnoise_tracer_init(struct trace_array *tr)
{
-
- /* Only allow one instance to enable this */
- if (osnoise_has_registered_instances())
+ /*
+ * Only allow osnoise tracer if timerlat tracer is not running
+ * already.
+ */
+ if (osnoise_data.timerlat_tracer)
return -EBUSY;
tr->max_latency = 0;
@@ -2135,45 +2172,55 @@ static void timerlat_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;
- osnoise_data.timerlat_tracer = 1;
-
retval = osnoise_workload_start();
if (retval)
- goto out_err;
+ pr_err(BANNER "Error starting timerlat tracer\n");
osnoise_register_instance(tr);
return;
-out_err:
- pr_err(BANNER "Error starting timerlat tracer\n");
}
static void timerlat_tracer_stop(struct trace_array *tr)
{
int cpu;
- if (!osnoise_has_registered_instances())
- return;
-
- for_each_online_cpu(cpu)
- per_cpu(per_cpu_osnoise_var, cpu).sampling = 0;
+ osnoise_unregister_instance(tr);
- osnoise_tracer_stop(tr);
+ /*
+ * Instruct the threads to stop only if this is the last instance.
+ */
+ if (!osnoise_has_registered_instances()) {
+ for_each_online_cpu(cpu)
+ per_cpu(per_cpu_osnoise_var, cpu).sampling = 0;
+ }
- osnoise_data.timerlat_tracer = 0;
+ osnoise_workload_stop();
}
static int timerlat_tracer_init(struct trace_array *tr)
{
- /* Only allow one instance to enable this */
- if (osnoise_has_registered_instances())
+ /*
+ * Only allow timerlat tracer if osnoise tracer is not running already.
+ */
+ if (osnoise_has_registered_instances() && !osnoise_data.timerlat_tracer)
return -EBUSY;
- tr->max_latency = 0;
+ /*
+ * If this is the first instance, set timerlat_tracer to block
+ * osnoise tracer start.
+ */
+ if (!osnoise_has_registered_instances())
+ osnoise_data.timerlat_tracer = 1;
+ tr->max_latency = 0;
timerlat_tracer_start(tr);
return 0;
@@ -2182,6 +2229,13 @@ static int timerlat_tracer_init(struct trace_array *tr)
static void timerlat_tracer_reset(struct trace_array *tr)
{
timerlat_tracer_stop(tr);
+
+ /*
+ * If this is the last instance, reset timerlat_tracer allowing
+ * osnoise to be started.
+ */
+ if (!osnoise_has_registered_instances())
+ osnoise_data.timerlat_tracer = 0;
}
static struct tracer timerlat_tracer __read_mostly = {
--
2.31.1
next prev parent reply other threads:[~2021-10-18 16:49 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-10-18 16:48 [PATCH V3 00/19] RTLA: An interface for osnoise/timerlat tracers Daniel Bristot de Oliveira
2021-10-18 16:48 ` [PATCH V3 01/19] trace/osnoise: Do not follow tracing_cpumask Daniel Bristot de Oliveira
2021-10-18 16:48 ` [PATCH V3 02/19] trace/osnoise: Split workload start from the tracer start Daniel Bristot de Oliveira
2021-10-18 16:48 ` [PATCH V3 03/19] trace/osnoise: Use start/stop_per_cpu_kthreads() on osnoise_cpus_write() Daniel Bristot de Oliveira
2021-10-18 16:48 ` [PATCH V3 04/19] trace/osnoise: Support a list of trace_array *tr Daniel Bristot de Oliveira
2021-10-18 16:48 ` Daniel Bristot de Oliveira [this message]
2021-10-18 16:48 ` [PATCH V3 06/19] rtla: Real-Time Linux Analysis tool Daniel Bristot de Oliveira
2021-10-18 19:30 ` Ahmed S. Darwish
2021-10-19 8:06 ` Daniel Bristot de Oliveira
2021-10-18 16:48 ` [PATCH V3 07/19] rtla: Helper functions for rtla Daniel Bristot de Oliveira
2021-10-18 16:48 ` [PATCH V3 08/19] rtla: Add osnoise tool Daniel Bristot de Oliveira
2021-10-18 16:48 ` [PATCH V3 09/19] rtla/osnoise: Add osnoise top mode Daniel Bristot de Oliveira
2021-10-18 16:48 ` [PATCH V3 10/19] rtla/osnoise: Add the hist mode Daniel Bristot de Oliveira
2021-10-18 16:48 ` [PATCH V3 11/19] rtla: Add timerlat tool and timelart top mode Daniel Bristot de Oliveira
2021-10-18 16:48 ` [PATCH V3 12/19] rtla/timerlat: Add timerlat hist mode Daniel Bristot de Oliveira
2021-10-18 16:48 ` [PATCH V3 13/19] rtla: Add Documentation Daniel Bristot de Oliveira
2021-10-18 17:43 ` Jonathan Corbet
2021-10-19 12:56 ` Daniel Bristot de Oliveira
2021-10-19 13:21 ` Steven Rostedt
2021-10-19 14:07 ` Daniel Bristot de Oliveira
2021-10-19 14:45 ` Steven Rostedt
2021-10-19 15:08 ` Daniel Bristot de Oliveira
2021-10-19 15:25 ` Steven Rostedt
2021-10-19 15:43 ` Daniel Bristot de Oliveira
2021-10-19 15:28 ` Jonathan Corbet
2021-10-19 15:36 ` Steven Rostedt
2021-10-19 15:41 ` Daniel Bristot de Oliveira
2021-10-19 19:18 ` Jonathan Corbet
2021-10-18 16:48 ` [PATCH V3 14/19] rtla: Add rtla osnoise man page Daniel Bristot de Oliveira
2021-10-18 16:48 ` [PATCH V3 15/19] rtla: Add rtla osnoise top documentation Daniel Bristot de Oliveira
2021-10-18 16:48 ` [PATCH V3 16/19] rtla: Add rtla osnoise hist documentation Daniel Bristot de Oliveira
2021-10-18 16:48 ` [PATCH V3 17/19] rtla: Add rtla timerlat documentation Daniel Bristot de Oliveira
2021-10-18 16:48 ` [PATCH V3 18/19] rtla: Add rtla timerlat top documentation Daniel Bristot de Oliveira
2021-10-18 16:48 ` [PATCH V3 19/19] rtla: Add rtla timerlat hist documentation Daniel Bristot de Oliveira
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=c9809c7e80a5dba6f667101951dfa5d2db83b95a.1634574261.git.bristot@kernel.org \
--to=bristot@kernel.org \
--cc=bigeasy@linutronix.de \
--cc=jkacur@redhat.com \
--cc=juri.lelli@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rt-users@vger.kernel.org \
--cc=linux-trace-devel@vger.kernel.org \
--cc=mhiramat@kernel.org \
--cc=mingo@redhat.com \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=tglx@linutronix.de \
--cc=williams@redhat.com \
--cc=zanussi@kernel.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 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).