Welcome To openEuler Community
Hey @stavewu , thanks for your contribution to the community.
Bot Usage Manual
I'm the Bot here serving you. You can find the instructions on how to interact with me at Here . That means you can comment below every pull request or issue to trigger Bot Commands.
Contact Guide
If you have any questions, please contact the SIG: Kernel ,
and any of the maintainers: @hanjunguo, @oekernel, @sanglipeng, @wkfxxx, @zeng_zhaorong ,
and any of the committers: @CTC-XiboWang, @Frank_Sae, @GongLei-, @LiuYongQiang0816, @SuperSix173, @Tankll2021, @TrueAI, @allen-shi, @baratta, @bibo_mao, @caixu-blue, @chen-jun-hw, @chenjiesong, @chenjunxin1992, @chenke2026, @chiqijun, @chriszjh, @duanqiangwen, @eingesch, @fangfeng123, @fanghaiqinghw, @gaojuxin09, @gouhao2022, @guzitao, @hanjunguo, @hanliyang, @hellotcc, @henryze, @hewanhan, @hjx_gitff, @hongbo-lee, @hongwu-wang, @htforge, @hu-chunzhi, @hunan4222, @jackknight, @jerry_lilijun, @jiayi0118, @junlong-zheng, @juntianlinux, @kailiu42, @kaitiandu, @kazero00, @kevinzhu1, @kile2009, @koishimind, @kongzizaixian, @kylin-mayukun, @leoliu-oc, @li-huisong, @linan888, @linyunsheng, @liulongfang, @liyihang0226, @lostway1, @lujialin2, @markyuan4ta21, @mawupeng, @mingqian218472, @mingrui-liu, @mufengyan, @pigalsofine, @robinorg, @rock_hw, @sanglipeng, @shu-shengming, @shuaijiakun, @sming56_admin, @stavewu, @stkid, @sun_nanyong, @wangboe2022, @wanghang73, @wenzhiwei11, @whoisxxx, @wkfxxx, @woqidaideshi, @wsoydl, @xingmz1, @xukuohai, @yeweihua999, @ygn-ndwd-official, @yonghu_4dc5, @young-sun, @yubo-liu1, @yuehaibing_planb, @yuzenghui1, @zhang-changzhong, @zhangyi089, @zhujianwei001, @zichengqu, @zouyipeng, @zqiao216 .


@
issue变更为 [已取消/已挂起] 状态前,请操作者填写相关原因
请按如下格式评论原因后,重新进行操作
/reason xxxxxx


以下的要求不是强制性的, 未按模板评论时对issue无任何影响
issue处理注意事项:
1. 当前issue受影响的分支提交pr时, 须在pr描述中填写当前issue编号进行关联, 否则无法关闭当前issue;
2. 模板内容需要填写完整, 无论是受影响或者不受影响都需要填写完整内容,未引入的分支不需要填写, 否则无法关闭当前issue;
3. 以下为模板中需要填写完整的内容, 请复制到评论区回复, 注: 内容的标题名称(影响性分析说明, 缺陷严重等级, 受影响版本排查(受影响/不受影响), 修复是否涉及abi变化(是/否))不能省略,省略后defect-manager将无法正常解析填写内容.
评论区可能使用到的指令说明:
| 指令 | 指令说明 | 使用权限 |
|---|---|---|
| /check-issue | 触发defect-manager校验 | 不限 |
| /reason xxx | /reason +挂起或取消条件 | 不限 |
影响性分析说明:
缺陷严重等级:(Critical/High/Moderate/Low)
缺陷根因说明:
受影响版本排查(受影响/不受影响):
- openEuler-20.03-LTS-SP4:
- openEuler-22.03-LTS-SP3:
- openEuler-22.03-LTS-SP4:
- openEuler-24.03-LTS:
- openEuler-24.03-LTS-SP1:
- openEuler-24.03-LTS-SP2:
abi变化(是/否):
- openEuler-20.03-LTS-SP4:
- openEuler-22.03-LTS-SP3:
- openEuler-22.03-LTS-SP4:
- openEuler-24.03-LTS:
- openEuler-24.03-LTS-SP1:
- openEuler-24.03-LTS-SP2:
缺陷issue处理具体操作请参考:
https://atomgit.com/openeuler/cve-manager/blob/master/cve-vulner-manager/doc/md/defect-manager-manual.md
pr关联issue具体操作请参考:
https://docs.atomgit.com/docs/help/home/org_project/pullrequests/pr-related-issue


看了下,怀疑跟内核以下引入问题补丁有关:
ff2f66cd13a6 ("KVM: Introduce KVM_SET_USER_MEMORY_REGION2")
该补丁跟随这个PR合入:https://atomgit.com/openeuler/kernel/pull/21196
该补丁变更了kvm_vm_ioctl接口逻辑,对mem.flags进行了强检查
static long kvm_vm_ioctl(struct file *filp,
unsigned int ioctl, unsigned long arg)
{
case KVM_SET_USER_MEMORY_REGION: {
r = -EINVAL;
if (ioctl == KVM_SET_USER_MEMORY_REGION &&
(mem.flags & ~KVM_SET_USER_MEMORY_REGION_V1_FLAGS))
goto out;
...
qemu当前版本调用该接口未对mem.flags进行清零初始化,从而引发调用失败coredump。
qemu后续配套加了1个修复补丁:https://lore-kernel.gnuweeb.org/qemu-devel/20250723070951.1134374-3-xiaoyao.li@intel.com/
该补丁需要qemu配合合入升级。


qemu-8.2.0版本已合入修复补丁:https://atomgit.com/openeuler/qemu/pull/1868/commit



qemu-8.2.0版本已合入修复补丁:https://atomgit.com/openeuler/qemu/pull/1868/commit
前面修复补丁分析不对,这个补丁修复不了问题。
触发点是mem.flags & ~KVM_SET_USER_MEMORY_REGION_V1_FLAGS)检查了除给定flag外是否有其他的flag存在,存在则错误返回。
内核侧KVM_SET_USER_MEMORY_REGION_V1_FLAGS对应如下两个flag:
// virt/kvm/kvm_main.c
#define KVM_SET_USER_MEMORY_REGION_V1_FLAGS \
(KVM_MEM_LOG_DIRTY_PAGES | KVM_MEM_READONLY)
qemu侧通过kvm_mem_flags对flags赋值,其中kvm_mem_flags除上面内核要求的2个flag外,还涉及KVM_MEM_HUGE_POD、KVM_MEM_GUEST_MEMFD:
// accel/kvm/kvm-all.c
static int kvm_mem_flags(MemoryRegion *mr)
{
bool readonly = mr->readonly || memory_region_is_romd(mr);
int flags = 0;
if (memory_region_get_dirty_log_mask(mr) != 0) {
flags |= KVM_MEM_LOG_DIRTY_PAGES;
}
if (readonly && kvm_readonly_mem_allowed) {
flags |= KVM_MEM_READONLY;
}
#ifdef CONFIG_HUGEPAGE_POD
if (memory_region_is_huge_pod(mr)) {
flags |= KVM_MEM_HUGE_POD;
}
#endif
if (memory_region_has_guest_memfd(mr)) {
assert(kvm_guest_memfd_supported);
flags |= KVM_MEM_GUEST_MEMFD;
}
return flags;
}
static void kvm_set_phys_mem(KVMMemoryListener *kml,
MemoryRegionSection *section, bool add)
{
do {
...
mem->flags = kvm_mem_flags(mr);
...
if (err) {
fprintf(stderr, "%s: error registering slot: %s\n", __func__,
strerror(-err));
abort();
}
KVM_MEM_HUGE_POD不是来自qemu主线,并且只有在aarch64架构上涉及:
# hugepage pod
have_hugepage_pod = get_option('hugepage_pod') \
.require(targetos == 'linux', error_message: 'hugepage_pod is supported only on Linux') \
.require(cpu == 'aarch64', error_message: 'hugepage_pod is supported only on aarch64') \
.allowed()
config_host_data.set('CONFIG_HUGEPAGE_POD', have_hugepage_pod)
问题复现的qemu-system-aarch64上CONFIG_HUGEPAGE_POD是使能的。


验证后确认跟KVM_MEM_HUGE_POD也没关系,实际调用传给内核的flags值为KVM_MEM_READONLY。
所以内核中:
r = -EINVAL;
if (ioctl == KVM_SET_USER_MEMORY_REGION &&
(mem.flags & ~KVM_SET_USER_MEMORY_REGION_V1_FLAGS))
goto out; // 这个条件应当是通过的
r = kvm_vm_ioctl_set_memory_region(kvm, &mem); // 需打开这个函数细看返回值来源
break;


这个问题是 kvm: replace __KVM_HAVE_READONLY_MEM with Kconfig symbol没合入导致的问题。 导致在arm架构下的kvm_arch_has_readonly_mem永远返回了false(IS_ENABLED(CONFIG_HAVE_KVM_READONLY_MEM)未开)


这个问题是 kvm: replace __KVM_HAVE_READONLY_MEM with Kconfig symbol(https://git.zx2c4.com/linux-rng/commit/virt/kvm?h=jd/vdso-test-harness&id=8886640dade4ae2595fcdce511c8bcc716aa47d3)没合入导致的问题。
同时需要打开CONFIG_HAVE_KVM_READONLY_MEM编译选项。
ok,主线上完整的commit变更是:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8886640dade4ae2595fcdce511c8bcc716aa47d3
整体逻辑:
1、引入问题补丁:f7742742c221 ("KVM: x86: Disallow read-only memslots for SEV-ES and SEV-SNP (and TDX)"),该补丁对check_memory_region_flags函数做了修改,删除了__KVM_HAVE_READONLY_MEM宏,而使用kvm_arch_has_readonly_mem()
2、kvm_arch_has_readonly_mem默认在arch未定义时走IS_ENABLED(CONFIG_HAVE_KVM_READONLY_MEM),x86当前实现了kvm_arch_has_readonly_mem,但其他架构没有
3、CONFIG_HAVE_KVM_READONLY_MEM未被其他架构select,从而引发问题。
简单来说,主线从__KVM_HAVE_READONLY_MEM切换到kvm_arch_has_readonly_mem(),同时有补丁8886640dade4 ("kvm: replace __KVM_HAVE_READONLY_MEM with Kconfig symbol")处理各架构对原有__KVM_HAVE_READONLY_MEM的依赖问题,PR https://atomgit.com/openeuler/kernel/pull/21196在backport时未将该补丁合入,进而引发qemu报错。


@allen-shi 未对受影响版本排查/abi变化进行分析


环境信息
【OS版本】(如openEuler-22.03-LTS,参考命令"cat /etc/os-release"结果)
【内核版本】(如kernel-5.10.0-60.138.0.165,参考命令"uname -r"结果)
6.6.0-162.0.0
【硬件平台】(缺陷相关的硬件信息,如:处理器型号、内存、磁盘、网卡、BIOS 等信息)
【组网信息】(和网络、性能相关的问题,应该说明详细的组网和场景信息)
缺陷信息
【问题复现步骤】
【实际结果】请描述出问题的结果和影响
qemu拉起失败coredump,报错日志为:
【期望结果】请描述出期望的结果和影响
虚拟机拉起成功。
【其他相关附件信息】比如 syslog、dmesg、panic、lockup、kdump 信息、图片等
【已分析信息】如已经做过分析和定位,请尽量附上详细的分析结果
二、缺陷分析结构反馈
影响性分析说明:
缺陷严重等级:(Critical/High/Moderate/Low)
缺陷根因说明:
受影响版本排查(受影响/不受影响):
openEuler-20.03-LTS-SP4
openEuler-22.03-LTS-SP3
openEuler-22.03-LTS-SP4
openEuler-24.03-LTS
openEuler-24.03-LTS-SP1
openEuler-24.03-LTS-SP2
修复是否涉及abi变化(是/否):
openEuler-20.03-LTS-SP4
openEuler-22.03-LTS-SP3
openEuler-22.03-LTS-SP4
openEuler-24.03-LTS
openEuler-24.03-LTS-SP1
openEuler-24.03-LTS-SP2