REORG: sched: move the stolen CPU time detection to sched_entering_poll()

That's where that code initially was but it had been moved to
activity_count_runtime() for pure reasons of dependency loops. These
ones are no longer true so we can move that code back to the scheduler
and keep it where the information are updated and checked.
This commit is contained in:
Willy Tarreau 2021-09-30 18:20:30 +02:00
parent 6dfab112e1
commit 1cdb531ec8
2 changed files with 23 additions and 19 deletions

View File

@ -42,9 +42,6 @@ void report_stolen_time(uint64_t stolen);
*/
static inline void activity_count_runtime()
{
uint64_t new_mono_time;
uint64_t new_cpu_time;
int64_t stolen;
uint32_t run_time;
uint32_t up, down;
@ -54,22 +51,6 @@ static inline void activity_count_runtime()
up = 1000;
down = up * 99 / 100;
new_cpu_time = now_cpu_time();
new_mono_time = now_mono_time();
if (ti->prev_cpu_time && ti->prev_mono_time) {
new_cpu_time -= ti->prev_cpu_time;
new_mono_time -= ti->prev_mono_time;
stolen = new_mono_time - new_cpu_time;
if (unlikely(stolen >= 500000)) {
stolen /= 500000;
/* more than half a millisecond difference might
* indicate an undesired preemption.
*/
report_stolen_time(stolen);
}
}
run_time = (before_poll.tv_sec - after_poll.tv_sec) * 1000000U + (before_poll.tv_usec - after_poll.tv_usec);
run_time = swrate_add(&activity[tid].avg_loop_us, TIME_STATS_SAMPLES, run_time);

View File

@ -658,10 +658,33 @@ static inline void sched_leaving_poll(int timeout, int interrupted)
/* Collect date and time information before calling poll(). This will be used
* to count the run time of the past loop and the sleep time of the next poll.
* It also compares the elasped and cpu times during the activity period to
* estimate the amount of stolen time, which is reported if higher than half
* a millisecond.
*/
static inline void sched_entering_poll()
{
uint64_t new_mono_time;
uint64_t new_cpu_time;
int64_t stolen;
gettimeofday(&before_poll, NULL);
new_cpu_time = now_cpu_time();
new_mono_time = now_mono_time();
if (ti->prev_cpu_time && ti->prev_mono_time) {
new_cpu_time -= ti->prev_cpu_time;
new_mono_time -= ti->prev_mono_time;
stolen = new_mono_time - new_cpu_time;
if (unlikely(stolen >= 500000)) {
stolen /= 500000;
/* more than half a millisecond difference might
* indicate an undesired preemption.
*/
report_stolen_time(stolen);
}
}
}
/* This function register a new signal. "lua" is the current lua