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的好机会又来了,开看。
先网上搜了点资料,大概看了下sche易做图ng 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或许收获更多。
补充:综合编程 , 其他综合 ,