这篇博客详细介绍了Linux内核调度中如何计算任务的繁忙时间,特别是通过WALT(Windowed Average Load Tracking)机制。内容涉及初始化变量、根据不同任务类型判断是否计算繁忙时间,以及在不同场景下如何更新busy time,包括任务在当前窗口内外的情况,特别是当任务在运行队列(rq)中执行时的中断处理。
new_window = mark_start < window_start;
if (new_window) {//包含多个窗口
nr_full_windows = div64_u64((window_start - mark_start),
window_size);
if (p->ravg.active_windows < USHRT_MAX)
p->ravg.active_windows++;
}
/* Handle per-task window rollover. We don't care about the idle
* task or exiting tasks. */
if (new_window && !is_idle_task(p) && !exiting_task(p)) {
u32 curr_window = 0;
if (!nr_full_windows)
curr_window = p->ravg.curr_window;
p->ravg.prev_window = curr_window;
p->ravg.curr_window = 0;
}
2、根据task的类别判断是否需要计算busy time
2.1不需要更新busy time
if (!account_busy_for_cpu_time(rq, p, irqtime, event)) {
/* account_busy_for_cpu_time() = 0, so no update to the
* task's current window needs to be made. This could be
* for example
*
* - a wakeup event on a task within the current
* window (!new_window below, no action required),
* - switching to a new task from idle (PICK_NEXT_TASK)
* in a new window where irqtime is 0 and we aren't
* waiting on IO */
if (!new_window)
return;
/* A new window has started. The RQ demand must be rol