mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-03-17 12:34:01 +00:00
tracing/osnoise: Make osnoise_main to sleep for microseconds
osnoise's runtime and period are in the microseconds scale, but it is currently sleeping in the millisecond's scale. This behavior roots in the usage of hwlat as the skeleton for osnoise. Make osnoise to sleep in the microseconds scale. Also, move the sleep to a specialized function. Link: https://lkml.kernel.org/r/302aa6c7bdf2d131719b22901905e9da122a11b2.1645197336.git.bristot@kernel.org Cc: Ingo Molnar <mingo@redhat.com> Signed-off-by: Daniel Bristot de Oliveira <bristot@kernel.org> Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
This commit is contained in:
parent
ab2f993c01
commit
dd990352f0
1 changed files with 32 additions and 21 deletions
|
@ -1436,6 +1436,37 @@ out:
|
|||
static struct cpumask osnoise_cpumask;
|
||||
static struct cpumask save_cpumask;
|
||||
|
||||
/*
|
||||
* osnoise_sleep - sleep until the next period
|
||||
*/
|
||||
static void osnoise_sleep(void)
|
||||
{
|
||||
u64 interval;
|
||||
ktime_t wake_time;
|
||||
|
||||
mutex_lock(&interface_lock);
|
||||
interval = osnoise_data.sample_period - osnoise_data.sample_runtime;
|
||||
mutex_unlock(&interface_lock);
|
||||
|
||||
/*
|
||||
* differently from hwlat_detector, the osnoise tracer can run
|
||||
* without a pause because preemption is on.
|
||||
*/
|
||||
if (!interval) {
|
||||
/* Let synchronize_rcu_tasks() make progress */
|
||||
cond_resched_tasks_rcu_qs();
|
||||
return;
|
||||
}
|
||||
|
||||
wake_time = ktime_add_us(ktime_get(), interval);
|
||||
__set_current_state(TASK_INTERRUPTIBLE);
|
||||
|
||||
while (schedule_hrtimeout_range(&wake_time, 0, HRTIMER_MODE_ABS)) {
|
||||
if (kthread_should_stop())
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* osnoise_main - The osnoise detection kernel thread
|
||||
*
|
||||
|
@ -1444,30 +1475,10 @@ static struct cpumask save_cpumask;
|
|||
*/
|
||||
static int osnoise_main(void *data)
|
||||
{
|
||||
u64 interval;
|
||||
|
||||
while (!kthread_should_stop()) {
|
||||
|
||||
run_osnoise();
|
||||
|
||||
mutex_lock(&interface_lock);
|
||||
interval = osnoise_data.sample_period - osnoise_data.sample_runtime;
|
||||
mutex_unlock(&interface_lock);
|
||||
|
||||
do_div(interval, USEC_PER_MSEC);
|
||||
|
||||
/*
|
||||
* differently from hwlat_detector, the osnoise tracer can run
|
||||
* without a pause because preemption is on.
|
||||
*/
|
||||
if (interval < 1) {
|
||||
/* Let synchronize_rcu_tasks() make progress */
|
||||
cond_resched_tasks_rcu_qs();
|
||||
continue;
|
||||
}
|
||||
|
||||
if (msleep_interruptible(interval))
|
||||
break;
|
||||
osnoise_sleep();
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
Loading…
Add table
Reference in a new issue