Re: [PATCH V3 2/3] tracing/osnoise: Add preempt/irq disable options

From: Steven Rostedt
Date: Mon Nov 28 2022 - 15:39:32 EST


On Fri, 25 Nov 2022 22:20:23 +0100
Daniel Bristot de Oliveira <bristot@xxxxxxxxxx> 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.
> */