当前位置:编程学习 > 网站相关 >>

xen中dom0的cpu hotplug问题

之前在grub里面配置了一些参数,导致机器后续不能动态滴做一些调整,后续为了更好滴可扩展,打算试试cpu的hotplug功能。

写了个简单的hotplug脚本,就echo 0 > /sys/device/system/cpu/cpu9/online 这类的, 一跑机器就hang住了,message里面有一些错误信息,

诸如:ERROR: domain->groups does not contain CPU2

 


BUG: soft lockup - CPU#3 stuck for 61s! [sh:13441]

 

 

BUG: unable to handle kernel NULL pointer dereference at 0000000000000008
IP: [<ffffffff81052bdd>] find_busiest_group+0x783/0x825

 

 

总之看下去有很多乱七八糟的问题,但归根结底可能就一个root cause, 好吧,学习kernel的好机会又来了,开看。

 


先网上搜了点资料,大概看了下scheduling domain的背景知识,主要思想就是分层,分group。

我们没开NUMA,大概就三层 phy,core,thread

 


从最开始的最可疑的错误日志ERROR: domain->groups does not contain CPU2 分析,

经过一轮代码洗礼,比较怀疑cpumask这个东西,有如下日志参考

 


CPU15 attaching sched-domain:
 domain 0: span 0,8,15 level SIBLING
  groups: 15 (cpu_power = 392) 0 (cpu_power = 392) 8 (cpu_power = 392)
  domain 1: span 0,8,15 level MC
   groups: 15 (cpu_power = 1176) 7
ERROR: groups don't span domain->span
   domain 2: span 0-15 level CPU
    groups: 0,8,15 (cpu_power = 2200) 1,9 (cpu_power = 1178) 2,10 (cpu_power = 1178) 3,11 (cpu_power = 1178) 4,12 (cpu_power = 1178) 5,13 (cpu_power = 1178) 6,14 (cpu_power = 1178)
 7 (cpu_power = 2200)

 

 

这个日志上,在thread这层, span错掉了。

partition_sched_domains 里面会根据当前ndoms_cur和ndoms_new(=1)的cpumask对比,

是否相等来判断是否要detach和attach(__build_sched_domains)。

 


我们的路劲是先detach再__build_sched_domains, 里面会对sched_domain进行各种初始化,

最后再cpu_attach_domain,错误信息就是在里面打出来的。

从代码上没看到明显漏洞,会出现上述日志,而且cpumask从头到尾都是没有改过,很有可能是源头就出错。

 


那可以追到xen里面的cpu_bringup的set_cpu_sibling_map,它里面会比对当前所有

online的cpumask中cpu的c->phys_proc_id,和cpu_core_id,判断cpu是否和当前的cpu是互为sibling。

 

 

phys_proc_id和cpu_core_id是在identify_cpu里面根据c->initial_apicid进行计算出来的,

除非c->initial_apicid 错的就是它!!!

 


generic_identify里面会调用xen里面emulation的cpuid_ebx来进行initial_apicid的初始化,

难道是xen里面emulation错了???

 


继续跟踪cpuid_ebx,找到paravirt.h里面的pv_cpu_ops.cpuid,

再跟到enlighten.c里面xen_cpuid,
 发现了XEN_EMULATE_PREFIX 这个东东。

看到 .byte 0x0f,0x0b,0x78,0x65,0x6e这坨东西,想死的心都有了,

汇编已经是我的极限鸟,还来机器码, 这种代码看多了,皱纹都会多出几条来的。

速战速决,不想纠结,直接google, 没有搜到具体的内容,

但看到一个关键字invalid op, OK, 那我大概知道啦。不跟你玩了

 


果断在xen的traps.c里面找到相关操作pv_cpuid, 无非就是cpuid之后,对寄存器做一些处理后返回

但是对于ebx,可是没有任何操作的。好吧,我只能说,我反应太tmd的迟钝了。

 


手动xm vcpu-pin之后,所有问题都消失了,magic一样

 


别说你还没看懂,真没看懂的话,您或许就不适合再在这花时间了,去douban或许收获更多。

补充:综合编程 , 其他综合 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,