xen中dom0的cpu hotplug问题

本文通过分析CPU hotplug脚本导致的系统挂起问题,深入探讨了内核调度域(scheduling domain)的工作原理及错误排查过程。特别关注了cpumask和phys_proc_id在Xen虚拟化环境中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前在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一样
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值