bugzilla: https://bugzilla.openanolis.cn/show_bug.cgi?id=8572

这个PR包含了4个部分:CSV RING_BUFFER模式加速加密虚拟机迁移;CSV2虚拟机VMSA,GHCB状态迁移;CSV2虚拟机重启支持;CSV虚拟机重启修复。

  1. CSV RING_BUFFER模式加速加密虚拟机迁移。
    由于X86与PSP交互的时间消耗比较大,因此加密虚拟机的热迁移过程非常耗时。针对这个问题,海光将RING_BUFFER机制应用到CSV虚拟机的热迁移中,可极大地加快CSV虚拟机的热迁移速度。【Reference: !1920:增加海光CSV RING_BUFFER支持,对CSV虚拟机热迁移进行加速

相关补丁
anolis: crypto: ccp: Introduce init and free helpers to manage CSV RING_BUFFER queues
anolis: crypto: ccp: Add support for enqueue command pointers in CSV RING_BUFFER mode
anolis: crypto: ccp: Add support for dequeue status in CSV RING_BUFFER mode
anolis: crypto: ccp: Add support to switch to CSV RING_BUFFER mode
anolis: crypto: ccp: Add support for issue commands in CSV RING_BUFFER mode
anolis: KVM: SVM: Add KVM_CSV_COMMAND_BATCH command for applying CSV RING_BUFFER mode
anolis: KVM: SVM: Prepare memory pool to allocate buffers for KVM_CSV_COMMAND_BATCH
anolis: KVM: SVM: Add SEND_UPDATE_DATA command helper to support KVM_CSV_COMMAND_BATCH
anolis: KVM: SVM: Add RECEIVE_UPDATE_DATA command helper to support KVM_CSV_COMMAND_BATCH

验证记录:
在添加了CSV RING_BUFFER模式的补丁前后,2c 2G的CSV虚拟机迁移耗时得到显著下降,统计数据大致如下:
输入图片说明

  1. CSV2虚拟机VMSA,GHCB状态迁移。
    a. 当前的内核中定义了结构体struct sev_data_send_update_vmsa { ... };,这个结构体用于X86与PSP之间传递数据,但是目前内核中的定义与SEV API Spec 6.11中定义不一致(内核定义缺少一个32位的reserved字段)。
    【Reference: !1948:修复内核结构体struct sev_data_send_update_vmsa {}定义错误
    b. 海光CSV2虚拟机迁移需要支持VMSA迁移、GHCB状态迁移,此外,很多控制寄存器信息也需要迁移到远端(例如,长模式对于远端NPT页表的建立非常重要)。
    【Reference: !2038:支持海光CSV2虚拟机迁移

相关补丁
anolis: crypto: ccp: Fix definition of struct sev_data_send_update_vmsa
anolis: KVM: SVM: Add KVM_SEV_SEND_UPDATE_VMSA command
anolis: KVM: SVM: Add KVM_SEV_RECEIVE_UPDATE_VMSA command
anolis: KVM: x86: Restore control registers in __set_sregs() to support CSV2 guest live migration
anolis: KVM: SVM: Export MSR_AMD64_SEV_ES_GHCB to userspace for CSV2 guest

验证记录

迁移前
输入图片说明
迁移后
输入图片说明

  1. CSV2虚拟机重启支持。
    a. 引入control_{pre,post}_system_reset的ioctl接口,这样的话:用户态VMM可以在重置虚拟机状态前通过control_pre_system_reset接口告知KVM可以初始化虚拟机状态;用户态VMM可以在重置虚拟机状态后通过control_post_system_reset恢复重置时的已加密的VMSA。
    b. 实现reset_vmsa成员,在LAUNCH_UPDATE_VMSA时备份初始的加密的VMSA;KVM在响应control_pre_system_reset请求时,控制允许用户态VMM重置虚拟机状态;KVM在响应control_post_system_reset请求时,恢复LAUNCH_UPDATE_VMSA加密的VMSA,在下次执行VMRUN时,虚拟机将重新从OVMF阶段运行。
    【Reference: !2071:支持CSV2虚拟机重启,并修复内存加密虚拟机重启时的潜在bug

相关补丁
anolis: KVM: x86: Introduce control_{pre,post}_system_reset ioctl interfaces
anolis: KVM: SVM: Add support for rebooting CSV2 guest

验证记录

重启
输入图片说明
再次登录
输入图片说明

  1. CSV虚拟机重启修复。
    a. 解决内存加密虚拟机重启时潜在的bug。虚拟机重启之前,gpa1可能是解密映射的,x86 core的cache缓存的是解密映射数据data1;在重启之后,gpa1有可能变成了加密映射的,x86 core的cache又缓存了一份加密映射数据data2;如果在下一次访问gpa1之前,data2被回刷到内存,然后data1被回刷到内存,那么内存中将被重启之前的脏数据污染,严重时会导致虚拟机崩溃。
    【Reference: !2071:支持CSV2虚拟机重启,并修复内存加密虚拟机重启时的潜在bug

相关补丁
anolis: KVM: SVM: Force flush caches before reboot CSV guest