最近Arm上的vCPU hotplug 的patch的rfc版快要发布出来了,做了一些测试debug,了解了一些内部原理,记录一下。
vCPU hotplug 的含义:在虚拟机运行时插入新的vCPU,无需重启虚拟机。
vCPU hotplug可以认为包含两个阶段:1. vCPU hot add,即插入vCPU,由ACPI驱动;2. 上电,cpu online,由PSCI控制。
CPU在linux内核中的几个状态:possible,present,online, offline。
possible的含义是所有可能可用的CPU,present指现在存在的CPU,online指的是已经上电的CPU,offline指的是未来可用+存在但没上电的CPU。正在开发当中的patch,认为possible = present,也就是凡是ACPI表中描述的东西都认为是存在的。这跟x86的实现是不同,x86认为present CPU是现在确实存在的,possible - present = 可以hotplug的CPU。这么解释hotplug其实更加合理。但是Arm就是这么特别。
由于gic在VM启动之后内部组件的数量不可更改,因此在初始化阶段就需要给所有possible cpu创建gicc和gicr,同时也意味着要创建所有possible cpu的对象,然后将disabled cpu park起来(我的理解是暂时不创建vcpu thread)
要保证gicr的存在,唯一的办法是在madt表中创建gicr struct。
acpi 6.5中有关online capable bit对linux不起作用。
之前存在于kvm中的psci fw可以在VMM中处理。
一旦vcpu hotplug开始,guest会收到ged irq。通过调用acpi表中的ged的evt method来处理中断。该method将返回notify method来通知guest os是哪个设备产生了event,通过一系列函数调用,guest 获取该cpu的device id,mpidr以及当前的状态。注册cpu到sysfs,发送uevent到guest userspace,udev尝试online 该cpu。guest kernel调用hvc route到kvm,kvm转发请求到vmm,由vmm来决定是否online。返回结果。