- 根据不同Task类型做不同busytime时间的计算;
- 核心计算方式均相同,只是具体数值差异;
- 更新数据为
Task中prev_window、curr_window
rq中prev_runable_sum、curr_runnable_sum
1、获取初始化变量
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 rolled
* over i