[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20221128153919.33c008d1@gandalf.local.home>
Date: Mon, 28 Nov 2022 15:39:19 -0500
From: Steven Rostedt <rostedt@...dmis.org>
To: Daniel Bristot de Oliveira <bristot@...nel.org>
Cc: Masami Hiramatsu <mhiramat@...nel.org>,
Jonathan Corbet <corbet@....net>,
Juri Lelli <juri.lelli@...hat.com>,
Clark Williams <williams@...hat.com>,
linux-doc@...r.kernel.org, linux-kernel@...r.kernel.org
Subject: Re: [PATCH V3 2/3] tracing/osnoise: Add preempt/irq disable options
On Fri, 25 Nov 2022 22:20:23 +0100
Daniel Bristot de Oliveira <bristot@...nel.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.
> */
Powered by blists - more mailing lists