捉虫日记 0014: RMI XLS 启动时间偏长
来自Jack's Lab
1 现象
环境:
- RMI XLS 416 评估板
- 内核版本 2.6.34-rc5
- 基于 SDK 1.7.0 (内核版本 2.6.27) 升级
内核启动正常,mount 文件系统后,用户态进程初始化太慢,Level 3 的所有进程全起来大概要 10 分钟左右,抓狂。。。
2 分析
查了最近一次对代码所作的修改,发现主要集中在三处,一个是对 RMI XLS416 之 COP2 异常的处理(将原 do_cpu 之 CU2 异常处理修改为与 mainline 一致),一个是编译参数的改变(由 -march=r8000 改为 -march=xlr),还有一个就是对 TLB Refill Handler 生成函数逻辑的修改。
原 TLB Refill Handler 生成逻辑为:
@@ -335,6 +342,8 @@ static void __cpuinit build_tlb_write_entry(u32 **p, struct uasm_label **l, case CPU_ALCHEMY: tlbw(p); break; + case CPU_PHOENIX: + tlbw(p); case CPU_NEVADA: uasm_i_nop(p); /* QED specifies 2 nops hazard */
咋一看在 tlbw(p); 后少了条 break,于是在 reviewer 指出后,顺手就加上了,编译通过,启动没问题,于是很轻率地就改了过来。哪知这一改,启动时间成倍加长
3 解决
case CPU_PHOENIX: uasm_i_nop(p); /* QED specifies 2 nops hazard */ /* * This branch uses up a mtc0 hazard nop slot and saves * a nop after the tlbw instruction. */ uasm_il_bgezl(p, r, 0, label_tlbw_hazard); tlbw(p); uasm_l_tlbw_hazard(l, *p); break;