Skip to content

Commit

Permalink
tracing/osnoise: Skip running osnoise if all instances are off
Browse files Browse the repository at this point in the history
In the case of all tracing instances being off, sleep for the entire
period.

 Q: Why not kill all threads so?
 A: It is valid and useful to start the threads with tracing off.
For example, rtla disables tracing, starts the tracer, applies the
scheduling setup to the threads, e.g., sched priority and cgroup,
and then begin tracing with all set.

Skipping the period helps to speed up rtla setup and save the
trace after a stop tracing.

Link: https://lkml.kernel.org/r/aa4dd9b7e76fcb63901fe5407e15ec002b318599.1686063934.git.bristot@kernel.org

Cc: Juri Lelli <[email protected]>
Cc: William White <[email protected]>
Cc: Daniel Bristot de Oliveira <[email protected]>
Cc: Masami Hiramatsu <[email protected]>
Cc: Jonathan Corbet <[email protected]>
Signed-off-by: Daniel Bristot de Oliveira <[email protected]>
Signed-off-by: Steven Rostedt (Google) <[email protected]>
  • Loading branch information
Daniel Bristot de Oliveira authored and rostedt committed Jun 22, 2023
1 parent 4998e7f commit cb7ca87
Showing 1 changed file with 28 additions and 3 deletions.
31 changes: 28 additions & 3 deletions kernel/trace/trace_osnoise.c
Original file line number Diff line number Diff line change
Expand Up @@ -1285,6 +1285,22 @@ static __always_inline void osnoise_stop_tracing(void)
rcu_read_unlock();
}

/*
* osnoise_has_tracing_on - Check if there is at least one instance on
*/
static __always_inline int osnoise_has_tracing_on(void)
{
struct osnoise_instance *inst;
int trace_is_on = 0;

rcu_read_lock();
list_for_each_entry_rcu(inst, &osnoise_instances, list)
trace_is_on += tracer_tracing_is_on(inst->tr);
rcu_read_unlock();

return trace_is_on;
}

/*
* notify_new_max_latency - Notify a new max latency via fsnotify interface.
*/
Expand Down Expand Up @@ -1517,13 +1533,16 @@ static struct cpumask save_cpumask;
/*
* osnoise_sleep - sleep until the next period
*/
static void osnoise_sleep(void)
static void osnoise_sleep(bool skip_period)
{
u64 interval;
ktime_t wake_time;

mutex_lock(&interface_lock);
interval = osnoise_data.sample_period - osnoise_data.sample_runtime;
if (skip_period)
interval = osnoise_data.sample_period;
else
interval = osnoise_data.sample_period - osnoise_data.sample_runtime;
mutex_unlock(&interface_lock);

/*
Expand Down Expand Up @@ -1604,8 +1623,14 @@ static int osnoise_main(void *data)
if (osnoise_migration_pending())
break;

/* skip a period if tracing is off on all instances */
if (!osnoise_has_tracing_on()) {
osnoise_sleep(true);
continue;
}

run_osnoise();
osnoise_sleep();
osnoise_sleep(false);
}

migrate_enable();
Expand Down

0 comments on commit cb7ca87

Please sign in to comment.