All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH V3 0/3] Add osnoise/options options
@ 2022-11-25 21:20 Daniel Bristot de Oliveira
  2022-11-25 21:20 ` [PATCH V3 1/3] tracing/osnoise: Add PANIC_ON_STOP option Daniel Bristot de Oliveira
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Daniel Bristot de Oliveira @ 2022-11-25 21:20 UTC (permalink / raw)
  To: Daniel Bristot de Oliveira, Steven Rostedt
  Cc: Masami Hiramatsu, Jonathan Corbet, Juri Lelli, Clark Williams,
	linux-doc, linux-kernel

Was: Allow osnoise tracer to run without workload [1]

After adding the osnoise/options file, a set of on/off options
came to my mind, most based on discussions while debugging problems
with Juri and Clark.

The PANIC_ON_STOP option facilitates the vmcore generation to aid
in the latency analysis using a crash dump.

The OSNOISE_PREEMPT_DISABLE and OSNOISE_IRQ_DISABLE options refine
the type of noise that the osnoise tracer detects, allowing the
tool to measure only IRQ-related noise, or NMI/HW-related noise,
respectively.

Each patch has a description of the options and the last patch
documents them in the osnoise documentation file.

[1] https://lore.kernel.org/r/cover.1668692096.git.bristot@kernel.org/

Changes from v2:
  - rebased on top of linux-trace.git/ftrace/core
  - removed the patches already added to the ftrace/core
Changes from v1:
  - Changed the cover letter topic
  - Add Acked-by Masami to the first patch
  - Add the PANIC_ON_STOP option
  - Add the OSNOISE_PREEMPT_DISABLE and OSNOISE_IRQ_DISABLE options
  - Improved the documentation

Daniel Bristot de Oliveira (3):
  tracing/osnoise: Add PANIC_ON_STOP option
  tracing/osnoise: Add preempt and/or irq disabled options
  Documentation/osnoise: Add osnoise/options documentation

 Documentation/trace/osnoise-tracer.rst | 20 ++++++++++--
 kernel/trace/trace_osnoise.c           | 44 +++++++++++++++++++++++---
 2 files changed, 57 insertions(+), 7 deletions(-)

-- 
2.32.0


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH V3 1/3] tracing/osnoise: Add PANIC_ON_STOP option
  2022-11-25 21:20 [PATCH V3 0/3] Add osnoise/options options Daniel Bristot de Oliveira
@ 2022-11-25 21:20 ` Daniel Bristot de Oliveira
  2022-11-25 21:20 ` [PATCH V3 2/3] tracing/osnoise: Add preempt/irq disable options Daniel Bristot de Oliveira
  2022-11-25 21:20 ` [PATCH V3 3/3] Documentation/osnoise: Add osnoise/options documentation Daniel Bristot de Oliveira
  2 siblings, 0 replies; 9+ messages in thread
From: Daniel Bristot de Oliveira @ 2022-11-25 21:20 UTC (permalink / raw)
  To: Daniel Bristot de Oliveira, Steven Rostedt
  Cc: Masami Hiramatsu, Jonathan Corbet, Juri Lelli, Clark Williams,
	linux-doc, linux-kernel

Often the latency observed in a CPU is not caused by the work being done
in the CPU itself, but by work done on another CPU that causes the
hardware to stall all CPUs. In this case, it is interesting to know
what is happening on ALL CPUs, and the best way to do this is via
crash dump analysis.

Add the PANIC_ON_STOP option to osnoise/timerlat tracers. The default
behavior is having this option off. When enabled by the user, the system
will panic after hitting a stop tracing condition.

This option was motivated by a real scenario that Juri Lelli and I
were debugging.

Cc: Juri Lelli <juri.lelli@redhat.com>
Cc: Daniel Bristot de Oliveira <bristot@kernel.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Jonathan Corbet <corbet@lwn.net>
Signed-off-by: Daniel Bristot de Oliveira <bristot@kernel.org>
---
 kernel/trace/trace_osnoise.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/kernel/trace/trace_osnoise.c b/kernel/trace/trace_osnoise.c
index 3f10dd1f2f1c..801eba0b5cf8 100644
--- a/kernel/trace/trace_osnoise.c
+++ b/kernel/trace/trace_osnoise.c
@@ -54,10 +54,11 @@
 enum osnoise_options_index {
 	OSN_DEFAULTS = 0,
 	OSN_WORKLOAD,
+	OSN_PANIC_ON_STOP,
 	OSN_MAX
 };
 
-static const char * const osnoise_options_str[OSN_MAX] = { "DEFAULTS", "OSNOISE_WORKLOAD" };
+static const char * const osnoise_options_str[OSN_MAX] = { "DEFAULTS", "OSNOISE_WORKLOAD", "PANIC_ON_STOP" };
 
 #define OSN_DEFAULT_OPTIONS	0x2
 unsigned long osnoise_options	= OSN_DEFAULT_OPTIONS;
@@ -1270,6 +1271,9 @@ static __always_inline void osnoise_stop_tracing(void)
 		trace_array_printk_buf(tr->array_buffer.buffer, _THIS_IP_,
 				"stop tracing hit on cpu %d\n", smp_processor_id());
 
+		if (test_bit(OSN_PANIC_ON_STOP, &osnoise_options))
+			panic("tracer hit stop condition on CPU %d\n", smp_processor_id());
+
 		tracer_tracing_off(tr);
 	}
 	rcu_read_unlock();
-- 
2.32.0


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH V3 2/3] tracing/osnoise: Add preempt/irq disable options
  2022-11-25 21:20 [PATCH V3 0/3] Add osnoise/options options Daniel Bristot de Oliveira
  2022-11-25 21:20 ` [PATCH V3 1/3] tracing/osnoise: Add PANIC_ON_STOP option Daniel Bristot de Oliveira
@ 2022-11-25 21:20 ` Daniel Bristot de Oliveira
  2022-11-28 20:39   ` Steven Rostedt
  2022-11-25 21:20 ` [PATCH V3 3/3] Documentation/osnoise: Add osnoise/options documentation Daniel Bristot de Oliveira
  2 siblings, 1 reply; 9+ messages in thread
From: Daniel Bristot de Oliveira @ 2022-11-25 21:20 UTC (permalink / raw)
  To: Daniel Bristot de Oliveira, Steven Rostedt
  Cc: Masami Hiramatsu, Jonathan Corbet, Juri Lelli, Clark Williams,
	linux-doc, linux-kernel

The osnoise workload runs with preemption and IRQs enabled in such
a way as to allow all sorts of noise to disturb osnoise's execution.
hwlat tracer has a similar workload but works with irq disabled,
allowing only NMIs and the hardware to generate noise.

While thinking about adding an options file to hwlat tracer to
allow the system to panic, and other features I was thinking
to add, like having a tracepoint at each noise detection, it
came to my mind that is easier to make osnoise and also do
hardware latency detection than making hwlat "feature compatible"
with osnoise.

Other points are:
 - osnoise already has an independent cpu file.
 - osnoise has a more intuitive interface, e.g., runtime/period vs.
   window/width (and people often need help remembering what it is).
 - osnoise: tracepoints
 - osnoise stop options
 - osnoise options file itself

Moreover, the user-space side (in rtla) is simplified by reusing the
existing osnoise code.

Finally, people have been asking me about using osnoise for hw latency
detection, and I have to explain that it was sufficient but not
necessary. These options make it sufficient and necessary.

Adding a Suggested-by Clark, as he often asked me about this
possibility.

Cc: Suggested-by: Clark Williams <williams@redhat.com>
Cc: Daniel Bristot de Oliveira <bristot@kernel.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Jonathan Corbet <corbet@lwn.net>
Signed-off-by: Daniel Bristot de Oliveira <bristot@kernel.org>
---
 kernel/trace/trace_osnoise.c | 40 +++++++++++++++++++++++++++++++-----
 1 file changed, 35 insertions(+), 5 deletions(-)

diff --git a/kernel/trace/trace_osnoise.c b/kernel/trace/trace_osnoise.c
index 801eba0b5cf8..14b7f4092982 100644
--- a/kernel/trace/trace_osnoise.c
+++ b/kernel/trace/trace_osnoise.c
@@ -55,10 +55,17 @@ enum osnoise_options_index {
 	OSN_DEFAULTS = 0,
 	OSN_WORKLOAD,
 	OSN_PANIC_ON_STOP,
+	OSN_PREEMPT_DISABLE,
+	OSN_IRQ_DISABLE,
 	OSN_MAX
 };
 
-static const char * const osnoise_options_str[OSN_MAX] = { "DEFAULTS", "OSNOISE_WORKLOAD", "PANIC_ON_STOP" };
+static const char * const osnoise_options_str[OSN_MAX] = {
+							"DEFAULTS",
+							"OSNOISE_WORKLOAD",
+							"PANIC_ON_STOP",
+							"OSNOISE_PREEMPT_DISABLE",
+							"OSNOISE_IRQ_DISABLE" };
 
 #define OSN_DEFAULT_OPTIONS	0x2
 unsigned long osnoise_options	= OSN_DEFAULT_OPTIONS;
@@ -1308,6 +1315,8 @@ static void notify_new_max_latency(u64 latency)
  */
 static int run_osnoise(void)
 {
+	bool preempt_disable = test_bit(OSN_PREEMPT_DISABLE, &osnoise_options);
+	bool irq_disable = test_bit(OSN_IRQ_DISABLE, &osnoise_options);
 	struct osnoise_variables *osn_var = this_cpu_osn_var();
 	u64 start, sample, last_sample;
 	u64 last_int_count, int_count;
@@ -1335,6 +1344,14 @@ static int run_osnoise(void)
 	 */
 	threshold = tracing_thresh ? : 5000;
 
+	/*
+	 * IRQ disable also implies in preempt disable.
+	 */
+	if (irq_disable)
+		local_irq_disable();
+	else if (preempt_disable)
+		preempt_disable();
+
 	/*
 	 * Make sure NMIs see sampling first
 	 */
@@ -1422,16 +1439,21 @@ static int run_osnoise(void)
 		 * cond_resched()
 		 */
 		if (IS_ENABLED(CONFIG_PREEMPT_RCU)) {
-			local_irq_disable();
+			if (!irq_disable)
+				local_irq_disable();
+
 			rcu_momentary_dyntick_idle();
-			local_irq_enable();
+
+			if (!irq_disable)
+				local_irq_enable();
 		}
 
 		/*
 		 * For the non-preemptive kernel config: let threads runs, if
-		 * they so wish.
+		 * they so wish, unless set not do to so.
 		 */
-		cond_resched();
+		if (!irq_disable && !preempt_disable)
+			cond_resched();
 
 		last_sample = sample;
 		last_int_count = int_count;
@@ -1450,6 +1472,14 @@ static int run_osnoise(void)
 	 */
 	barrier();
 
+	/*
+	 * Return to the preemptive state.
+	 */
+	if (irq_disable)
+		local_irq_enable();
+	else if (preempt_disable)
+		preempt_enable();
+
 	/*
 	 * Save noise info.
 	 */
-- 
2.32.0


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH V3 3/3] Documentation/osnoise: Add osnoise/options documentation
  2022-11-25 21:20 [PATCH V3 0/3] Add osnoise/options options Daniel Bristot de Oliveira
  2022-11-25 21:20 ` [PATCH V3 1/3] tracing/osnoise: Add PANIC_ON_STOP option Daniel Bristot de Oliveira
  2022-11-25 21:20 ` [PATCH V3 2/3] tracing/osnoise: Add preempt/irq disable options Daniel Bristot de Oliveira
@ 2022-11-25 21:20 ` Daniel Bristot de Oliveira
  2022-11-26 12:39   ` Bagas Sanjaya
  2 siblings, 1 reply; 9+ messages in thread
From: Daniel Bristot de Oliveira @ 2022-11-25 21:20 UTC (permalink / raw)
  To: Daniel Bristot de Oliveira, Steven Rostedt
  Cc: Masami Hiramatsu, Jonathan Corbet, Juri Lelli, Clark Williams,
	linux-doc, linux-kernel

Add the documentation about the osnoise/options file, the options,
and some additional explanation about the OSNOISE_WORKLOAD option.

Cc: Daniel Bristot de Oliveira <bristot@kernel.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Jonathan Corbet <corbet@lwn.net>
Signed-off-by: Daniel Bristot de Oliveira <bristot@kernel.org>
---
 Documentation/trace/osnoise-tracer.rst | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/Documentation/trace/osnoise-tracer.rst b/Documentation/trace/osnoise-tracer.rst
index 3c675ed82b27..0641781b00f5 100644
--- a/Documentation/trace/osnoise-tracer.rst
+++ b/Documentation/trace/osnoise-tracer.rst
@@ -92,8 +92,8 @@ Note that the example above shows a high number of HW noise samples.
 The reason being is that this sample was taken on a virtual machine,
 and the host interference is detected as a hardware interference.
 
-Tracer options
----------------------
+Tracer Configuration
+--------------------
 
 The tracer has a set of options inside the osnoise directory, they are:
 
@@ -115,6 +115,22 @@ The tracer has a set of options inside the osnoise directory, they are:
    NO_OSNOISE_WORKLOAD disables the OSNOISE_WORKLOAD option. The
    special DEAFAULTS option resets all options to the default value.
 
+Tracer Options
+--------------
+
+The osnoise/options file exposes a set of on/off configuration options for
+the osnoise tracer. These options are:
+
+ - DEFAULTS: reset the options to the default value.
+ - OSNOISE_WORKLOAD: do not dispatch osnoise workload (see dedicated
+   section below).
+ - PANIC_ON_STOP: call panic() if the tracer stops. This option serves to
+    capture a vmcore.
+ - OSNOISE_PREEMPT_DISABLE: disable preemption while running the osnoise
+   workload, allowing only IRQ and hardware-related noise.
+ - OSNOISE_IRQ_DISABLE: disable IRQs while running the osnoise workload,
+   allowing only NMIs and hardware-related noise, like hwlat tracer.
+
 Additional Tracing
 ------------------
 
-- 
2.32.0


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH V3 3/3] Documentation/osnoise: Add osnoise/options documentation
  2022-11-25 21:20 ` [PATCH V3 3/3] Documentation/osnoise: Add osnoise/options documentation Daniel Bristot de Oliveira
@ 2022-11-26 12:39   ` Bagas Sanjaya
  0 siblings, 0 replies; 9+ messages in thread
From: Bagas Sanjaya @ 2022-11-26 12:39 UTC (permalink / raw)
  To: Daniel Bristot de Oliveira
  Cc: Steven Rostedt, Masami Hiramatsu, Jonathan Corbet, Juri Lelli,
	Clark Williams, linux-doc, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 1737 bytes --]

On Fri, Nov 25, 2022 at 10:20:24PM +0100, Daniel Bristot de Oliveira wrote:
> +Tracer Options
> +--------------
> +
> +The osnoise/options file exposes a set of on/off configuration options for
> +the osnoise tracer. These options are:
> +
> + - DEFAULTS: reset the options to the default value.
> + - OSNOISE_WORKLOAD: do not dispatch osnoise workload (see dedicated
> +   section below).
> + - PANIC_ON_STOP: call panic() if the tracer stops. This option serves to
> +    capture a vmcore.

Excessive indentation makes PANIC_ON_STOP item above become definition list
instead. I have to make a small fixup:

---- >8 ----

diff --git a/Documentation/trace/osnoise-tracer.rst b/Documentation/trace/osnoise-tracer.rst
index 0641781b00f5e8..f2008e3172231d 100644
--- a/Documentation/trace/osnoise-tracer.rst
+++ b/Documentation/trace/osnoise-tracer.rst
@@ -125,7 +125,7 @@ the osnoise tracer. These options are:
  - OSNOISE_WORKLOAD: do not dispatch osnoise workload (see dedicated
    section below).
  - PANIC_ON_STOP: call panic() if the tracer stops. This option serves to
-    capture a vmcore.
+   capture a vmcore.
  - OSNOISE_PREEMPT_DISABLE: disable preemption while running the osnoise
    workload, allowing only IRQ and hardware-related noise.
  - OSNOISE_IRQ_DISABLE: disable IRQs while running the osnoise workload,

> + - OSNOISE_PREEMPT_DISABLE: disable preemption while running the osnoise
> +   workload, allowing only IRQ and hardware-related noise.
> + - OSNOISE_IRQ_DISABLE: disable IRQs while running the osnoise workload,
> +   allowing only NMIs and hardware-related noise, like hwlat tracer.
> +

Otherwise LGTM. 

-- 
An old man doll... just what I always wanted! - Clara

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH V3 2/3] tracing/osnoise: Add preempt/irq disable options
  2022-11-25 21:20 ` [PATCH V3 2/3] tracing/osnoise: Add preempt/irq disable options Daniel Bristot de Oliveira
@ 2022-11-28 20:39   ` Steven Rostedt
  2022-11-29  8:27     ` Daniel Bristot de Oliveira
  2022-11-30 15:47     ` Daniel Bristot de Oliveira
  0 siblings, 2 replies; 9+ messages in thread
From: Steven Rostedt @ 2022-11-28 20:39 UTC (permalink / raw)
  To: Daniel Bristot de Oliveira
  Cc: Masami Hiramatsu, Jonathan Corbet, Juri Lelli, Clark Williams,
	linux-doc, linux-kernel

On Fri, 25 Nov 2022 22:20:23 +0100
Daniel Bristot de Oliveira <bristot@kernel.org> wrote:

> @@ -1308,6 +1315,8 @@ static void notify_new_max_latency(u64 latency)
>   */
>  static int run_osnoise(void)
>  {
> +	bool preempt_disable = test_bit(OSN_PREEMPT_DISABLE, &osnoise_options);
> +	bool irq_disable = test_bit(OSN_IRQ_DISABLE, &osnoise_options);

	bool irq_disable = test_bit(OSN_IRQ_DISABLE, &osnoise_options);
	bool preempt_disable = IS_ENABLED(CONFIG_PREEMPT) &&
			!irq_disable && test_bit(OSN_PREEMPT_DISABLE, &osnoise_options);

>  	struct osnoise_variables *osn_var = this_cpu_osn_var();
>  	u64 start, sample, last_sample;
>  	u64 last_int_count, int_count;
> @@ -1335,6 +1344,14 @@ static int run_osnoise(void)
>  	 */
>  	threshold = tracing_thresh ? : 5000;
>  
> +	/*
> +	 * IRQ disable also implies in preempt disable.
> +	 */
> +	if (irq_disable)
> +		local_irq_disable();

	if (preempt_disable)
> +		preempt_disable();
> +
>  	/*
>  	 * Make sure NMIs see sampling first
>  	 */
> @@ -1422,16 +1439,21 @@ static int run_osnoise(void)
>  		 * cond_resched()
>  		 */
>  		if (IS_ENABLED(CONFIG_PREEMPT_RCU)) {
> -			local_irq_disable();
> +			if (!irq_disable)
> +				local_irq_disable();
> +
>  			rcu_momentary_dyntick_idle();
> -			local_irq_enable();
> +
> +			if (!irq_disable)
> +				local_irq_enable();
>  		}
>  
>  		/*
>  		 * For the non-preemptive kernel config: let threads runs, if
> -		 * they so wish.
> +		 * they so wish, unless set not do to so.
>  		 */
> -		cond_resched();
> +		if (!irq_disable && !preempt_disable)
> +			cond_resched();
>  
>  		last_sample = sample;
>  		last_int_count = int_count;
> @@ -1450,6 +1472,14 @@ static int run_osnoise(void)
>  	 */
>  	barrier();
>  
> +	/*
> +	 * Return to the preemptive state.
> +	 */

	if (preempt_disable)
> +		preempt_enable();
> +

> +	if (irq_disable)
> +		local_irq_enable();

-- Steve

>  	/*
>  	 * Save noise info.
>  	 */

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH V3 2/3] tracing/osnoise: Add preempt/irq disable options
  2022-11-28 20:39   ` Steven Rostedt
@ 2022-11-29  8:27     ` Daniel Bristot de Oliveira
  2022-11-30 15:47     ` Daniel Bristot de Oliveira
  1 sibling, 0 replies; 9+ messages in thread
From: Daniel Bristot de Oliveira @ 2022-11-29  8:27 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Masami Hiramatsu, Jonathan Corbet, Juri Lelli, Clark Williams,
	linux-doc, linux-kernel, Bagas Sanjaya

On 11/28/22 21:39, Steven Rostedt wrote:
> On Fri, 25 Nov 2022 22:20:23 +0100
> Daniel Bristot de Oliveira <bristot@kernel.org> wrote:
> 
>> @@ -1308,6 +1315,8 @@ static void notify_new_max_latency(u64 latency)
>>   */
>>  static int run_osnoise(void)
>>  {
>> +	bool preempt_disable = test_bit(OSN_PREEMPT_DISABLE, &osnoise_options);
>> +	bool irq_disable = test_bit(OSN_IRQ_DISABLE, &osnoise_options);
> 	bool irq_disable = test_bit(OSN_IRQ_DISABLE, &osnoise_options);
> 	bool preempt_disable = IS_ENABLED(CONFIG_PREEMPT) &&
> 			!irq_disable && test_bit(OSN_PREEMPT_DISABLE, &osnoise_options);
> 


Ooops, you are right. I will fix this, and the doc as well, in the v4.

Thanks
-- Daniel

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH V3 2/3] tracing/osnoise: Add preempt/irq disable options
  2022-11-28 20:39   ` Steven Rostedt
  2022-11-29  8:27     ` Daniel Bristot de Oliveira
@ 2022-11-30 15:47     ` Daniel Bristot de Oliveira
  2022-11-30 16:10       ` Steven Rostedt
  1 sibling, 1 reply; 9+ messages in thread
From: Daniel Bristot de Oliveira @ 2022-11-30 15:47 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Masami Hiramatsu, Jonathan Corbet, Juri Lelli, Clark Williams,
	linux-doc, linux-kernel

On 11/28/22 21:39, Steven Rostedt wrote:
> On Fri, 25 Nov 2022 22:20:23 +0100
> Daniel Bristot de Oliveira <bristot@kernel.org> wrote:
> 
>> @@ -1308,6 +1315,8 @@ static void notify_new_max_latency(u64 latency)
>>   */
>>  static int run_osnoise(void)
>>  {
>> +	bool preempt_disable = test_bit(OSN_PREEMPT_DISABLE, &osnoise_options);
>> +	bool irq_disable = test_bit(OSN_IRQ_DISABLE, &osnoise_options);
> 
> 	bool irq_disable = test_bit(OSN_IRQ_DISABLE, &osnoise_options);
> 	bool preempt_disable = IS_ENABLED(CONFIG_PREEMPT) &&
> 			!irq_disable && test_bit(OSN_PREEMPT_DISABLE, &osnoise_options);

Ooops again, that is not exactly what I wanted, because...

>>  	struct osnoise_variables *osn_var = this_cpu_osn_var();
>>  	u64 start, sample, last_sample;
>>  	u64 last_int_count, int_count;
>> @@ -1335,6 +1344,14 @@ static int run_osnoise(void)
>>  	 */
>>  	threshold = tracing_thresh ? : 5000;
>>  
>> +	/*
>> +	 * IRQ disable also implies in preempt disable.
>> +	 */
>> +	if (irq_disable)
>> +		local_irq_disable();
> 
> 	if (preempt_disable)
>> +		preempt_disable();
>> +
>>  	/*
>>  	 * Make sure NMIs see sampling first
>>  	 */
>> @@ -1422,16 +1439,21 @@ static int run_osnoise(void)
>>  		 * cond_resched()
>>  		 */
>>  		if (IS_ENABLED(CONFIG_PREEMPT_RCU)) {
>> -			local_irq_disable();
>> +			if (!irq_disable)
>> +				local_irq_disable();
>> +
>>  			rcu_momentary_dyntick_idle();
>> -			local_irq_enable();
>> +
>> +			if (!irq_disable)
>> +				local_irq_enable();
>>  		}
>>  
>>  		/*
>>  		 * For the non-preemptive kernel config: let threads runs, if
>> -		 * they so wish.
>> +		 * they so wish, unless set not do to so.
>>  		 */

Then I end up cond_resched'ing here in the non-preemptive kernel.

>> -		cond_resched();
>> +		if (!irq_disable && !preempt_disable)
>> +			cond_resched();

But I also want to avoid this cond_resched if preempt_disable is set.

So, I will merge both things:

	- change the preempt_disable assignment to check !irq_disabled, like:

		/*
		 * Disabling preemption is only required if IRQs are enabled, and the options is set on.
		 */
		preempt_disable = !irq_disable && test_bit(OSN_PREEMPT_DISABLE, &osnoise_options);

	- change the preempt disabled if to
		if (IS_ENABLED(CONFIG_PREEMPT) && preempt_disabled)
			preempt_disable();

I tested with both preemption models (preemptive and not preemptive) and it works fine.

am I missing something?

-- Daniel

>>  		last_sample = sample;
>>  		last_int_count = int_count;
>> @@ -1450,6 +1472,14 @@ static int run_osnoise(void)
>>  	 */
>>  	barrier();
>>  
>> +	/*
>> +	 * Return to the preemptive state.
>> +	 */
> 
> 	if (preempt_disable)
>> +		preempt_enable();
>> +
> 
>> +	if (irq_disable)
>> +		local_irq_enable();
> 
> -- Steve
> 
>>  	/*
>>  	 * Save noise info.
>>  	 */


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH V3 2/3] tracing/osnoise: Add preempt/irq disable options
  2022-11-30 15:47     ` Daniel Bristot de Oliveira
@ 2022-11-30 16:10       ` Steven Rostedt
  0 siblings, 0 replies; 9+ messages in thread
From: Steven Rostedt @ 2022-11-30 16:10 UTC (permalink / raw)
  To: Daniel Bristot de Oliveira
  Cc: Masami Hiramatsu, Jonathan Corbet, Juri Lelli, Clark Williams,
	linux-doc, linux-kernel

On Wed, 30 Nov 2022 16:47:29 +0100
Daniel Bristot de Oliveira <bristot@kernel.org> wrote:

> On 11/28/22 21:39, Steven Rostedt wrote:
> > On Fri, 25 Nov 2022 22:20:23 +0100
> > Daniel Bristot de Oliveira <bristot@kernel.org> wrote:
> >   
> >> @@ -1308,6 +1315,8 @@ static void notify_new_max_latency(u64 latency)
> >>   */
> >>  static int run_osnoise(void)
> >>  {
> >> +	bool preempt_disable = test_bit(OSN_PREEMPT_DISABLE, &osnoise_options);
> >> +	bool irq_disable = test_bit(OSN_IRQ_DISABLE, &osnoise_options);  
> > 
> > 	bool irq_disable = test_bit(OSN_IRQ_DISABLE, &osnoise_options);
> > 	bool preempt_disable = IS_ENABLED(CONFIG_PREEMPT) &&
> > 			!irq_disable && test_bit(OSN_PREEMPT_DISABLE, &osnoise_options);  
> 
> Ooops again, that is not exactly what I wanted, because...

Then just remove the "IS_ENABLED()" part and it should work just fine.

> 
> >>  	struct osnoise_variables *osn_var = this_cpu_osn_var();
> >>  	u64 start, sample, last_sample;
> >>  	u64 last_int_count, int_count;
> >> @@ -1335,6 +1344,14 @@ static int run_osnoise(void)
> >>  	 */
> >>  	threshold = tracing_thresh ? : 5000;
> >>  
> >> +	/*
> >> +	 * IRQ disable also implies in preempt disable.
> >> +	 */
> >> +	if (irq_disable)
> >> +		local_irq_disable();  
> > 
> > 	if (preempt_disable)  
> >> +		preempt_disable();

The above is a nop when CONFIG_PREEMPT is false.

> >> +
> >>  	/*
> >>  	 * Make sure NMIs see sampling first
> >>  	 */
> >> @@ -1422,16 +1439,21 @@ static int run_osnoise(void)
> >>  		 * cond_resched()
> >>  		 */
> >>  		if (IS_ENABLED(CONFIG_PREEMPT_RCU)) {
> >> -			local_irq_disable();
> >> +			if (!irq_disable)
> >> +				local_irq_disable();
> >> +
> >>  			rcu_momentary_dyntick_idle();
> >> -			local_irq_enable();
> >> +
> >> +			if (!irq_disable)
> >> +				local_irq_enable();
> >>  		}
> >>  
> >>  		/*
> >>  		 * For the non-preemptive kernel config: let threads runs, if
> >> -		 * they so wish.
> >> +		 * they so wish, unless set not do to so.
> >>  		 */  
> 
> Then I end up cond_resched'ing here in the non-preemptive kernel.

Sorry, I missed the point that you want to *not* cond_resched() even in a
CONFIG_PREEMPT is false situation, if preempt_disable flag is set. That's
the reason I added the IS_ENABLED(CONFIG_PREEMPT) check at the top. I
originally didn't have that, but then thought this should always happen in
that case.

> 
> >> -		cond_resched();
> >> +		if (!irq_disable && !preempt_disable)
> >> +			cond_resched();  
> 
> But I also want to avoid this cond_resched if preempt_disable is set.

Right, so just remove the IS_ENABLED() part in the beginning.

> 
> So, I will merge both things:
> 
> 	- change the preempt_disable assignment to check !irq_disabled, like:
> 
> 		/*
> 		 * Disabling preemption is only required if IRQs are enabled, and the options is set on.
> 		 */
> 		preempt_disable = !irq_disable && test_bit(OSN_PREEMPT_DISABLE, &osnoise_options);

Yep (that's what I original had until I changed it)

> 
> 	- change the preempt disabled if to
> 		if (IS_ENABLED(CONFIG_PREEMPT) && preempt_disabled)
> 			preempt_disable();

No need, preempt_disable() is a nop when CONFIG_PREEMPT is false.

> 
> I tested with both preemption models (preemptive and not preemptive) and it works fine.
> 
> am I missing something?

Just that you don't need to add the IS_ENABLED() part at all.

-- Steve

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2022-11-30 16:10 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-11-25 21:20 [PATCH V3 0/3] Add osnoise/options options Daniel Bristot de Oliveira
2022-11-25 21:20 ` [PATCH V3 1/3] tracing/osnoise: Add PANIC_ON_STOP option Daniel Bristot de Oliveira
2022-11-25 21:20 ` [PATCH V3 2/3] tracing/osnoise: Add preempt/irq disable options Daniel Bristot de Oliveira
2022-11-28 20:39   ` Steven Rostedt
2022-11-29  8:27     ` Daniel Bristot de Oliveira
2022-11-30 15:47     ` Daniel Bristot de Oliveira
2022-11-30 16:10       ` Steven Rostedt
2022-11-25 21:20 ` [PATCH V3 3/3] Documentation/osnoise: Add osnoise/options documentation Daniel Bristot de Oliveira
2022-11-26 12:39   ` Bagas Sanjaya

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.