【WALT】update_window_start()代码详解

【WALT】update_window_start()代码详解

代码版本:Linux4.9 android-msm-crosshatch-4.9-android12

代码展示

static u64
update_window_start(struct rq *rq, u64 wallclock, int event)
{
	s64 delta;
	int nr_windows;
	u64 old_window_start = rq->window_start;

	delta = wallclock - rq->window_start;
	/* If the MPM global timer is cleared, set delta as 0 to avoid kernel BUG happening */
	if (delta < 0) {
		delta = 0;
		WARN_ONCE(1, "WALT wallclock appears to have gone backwards or reset\n");
	}

	if (delta < sched_ravg_window)
		return old_window_start;

	nr_windows = div64_u64(delta, sched_ravg_window);
	rq->window_start += (u64)nr_windows * (u64)sched_ravg_window;
	rq->cum_window_demand = rq->walt_stats.cumulative_runnable_avg;
		
	return old_window_start;
}

代码逻辑

  1. delta = wallclock - rq->window_start;
    wallclock 是进入 WALT 算法时的时间,rq->window_start 是运行队列当前所在窗口的开始时间。
    通过 wallclock - rq->window_start ,得到从窗口开始到现在所经过的时间。
  2. if (delta < sched_ravg_window) return old_window_start;
    sched_ravg_window 是自定义的 WALT 算法的窗口的大小。
    如果从窗口开始到现在所经过的时间不到一个窗口的大小,说明窗口还未翻滚,还没有得到新的窗口开始时间,就直接返回久的窗口开始时间。
  3. nr_windows = div64_u64(delta, sched_ravg_window);
    如果执行到此处,说明窗口已经翻滚,计算从 rq 当前所在窗口的开始时间到现在一共经过了 nr_windows 个完整窗口。
  4. rq->window_start += (u64)nr_windows * (u64)sched_ravg_window;
    rq 新窗口的开始时间就是旧窗口开始时间加上 nr_windows 个完整窗口的时间。
  5. rq->cum_window_demand = rq->walt_stats.cumulative_runnable_avg;
    更新 rq 的累积的 demand,rq->walt_stats.cumulative_runnable_avg 详细计算将在详解 update_task_demand() 中介绍。
  6. return old_window_start;
    就算更新了 rq 的窗口开始时间,也先返回久的窗口开始时间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值