diff options
Diffstat (limited to 'kernel/trace/trace_osnoise.c')
| -rw-r--r-- | kernel/trace/trace_osnoise.c | 53 | 
1 files changed, 32 insertions, 21 deletions
| diff --git a/kernel/trace/trace_osnoise.c b/kernel/trace/trace_osnoise.c index 870a08da5b48..cfddb30e65ab 100644 --- a/kernel/trace/trace_osnoise.c +++ b/kernel/trace/trace_osnoise.c @@ -1437,6 +1437,37 @@ 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   *   * Calls run_osnoise() function to measure the osnoise for the configured runtime, @@ -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; |