已关闭
qemu启动报错kvm_set_phys_mem: error registering slot: Invalid argument #9555
Tengda Wu创建于  7月6日关闭于  7月9日
Tengda Wu
Tengda Wu成员
7月6日 创建

环境信息

【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 等信息)

【组网信息】(和网络、性能相关的问题,应该说明详细的组网和场景信息)

缺陷信息

【问题复现步骤】

  1. 内核升级到6.6.0-162.0.0
  2. 使用内置的qemu-8.2.0版本尝试拉起虚拟机

【实际结果】请描述出问题的结果和影响
qemu拉起失败coredump,报错日志为:

[root@openEuler qemu]# virsh start cvm_uefi1
error: Failed to start domain 'cvm_uefi1'
error: internal error: QEMU unexpectedly closed the monitor (vm='cvm_uefi1'): configure accelerator virt-8.2 start
machine init start
2026-07-02T07:44:58.723940Z qemu-system-aarch64: kvm_set_user_memory_region: KVM_SET_USER_MEMORY_REGION failed, slot=0, start=0x0, size=0x4000000: Invalid argument
kvm_set_phys_mem: error registering slot: Invalid argument

[root@openEuler qemu]# `

【期望结果】请描述出期望的结果和影响
虚拟机拉起成功。

【其他相关附件信息】比如 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

likedislike
openeuler-ci-botopeneuler-ci-bot成员
7月6日 添加了label:sig/Kernel
openeuler-ci-botopeneuler-ci-bot成员
7月6日 issue状态由 已挂起 改变为 待办的
openeuler-ci-bot
openeuler-ci-bot成员
7月6日 评论:

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 .

likedislike
openeuler-ci-bot
openeuler-ci-bot成员
7月6日 评论:

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


/reason xxxxxx

likedislike
openeuler-ci-botopeneuler-ci-bot成员
7月6日 将 allen-shi 设为负责人
openeuler-ci-botopeneuler-ci-bot成员
7月6日 修改了issue 的描述
openeuler-ci-bot
openeuler-ci-bot成员
7月6日 评论:

以下的要求不是强制性的, 未按模板评论时对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)

缺陷根因说明:

受影响版本排查(受影响/不受影响):

  1. openEuler-20.03-LTS-SP4:
  2. openEuler-22.03-LTS-SP3:
  3. openEuler-22.03-LTS-SP4:
  4. openEuler-24.03-LTS:
  5. openEuler-24.03-LTS-SP1:
  6. openEuler-24.03-LTS-SP2:

abi变化(是/否):

  1. openEuler-20.03-LTS-SP4:
  2. openEuler-22.03-LTS-SP3:
  3. openEuler-22.03-LTS-SP4:
  4. openEuler-24.03-LTS:
  5. openEuler-24.03-LTS-SP1:
  6. 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

likedislike
openeuler-ci-botopeneuler-ci-bot成员
7月6日 添加了label:DEFECT/UNFIXED
Tengda Wu
Tengda Wu成员
7月6日 评论:

看了下,怀疑跟内核以下引入问题补丁有关:
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配合合入升级。

likedislike
Tengda Wu
Tengda Wu成员
7月6日 评论:

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

likedislike
Tengda WuTengda Wu成员
7月6日 修改了issue 的描述
Tengda Wu
Tengda Wu成员
7月6日 评论:

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

@stavewu

前面修复补丁分析不对,这个补丁修复不了问题。
触发点是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是使能的。

likedislike
Tengda Wu
Tengda Wu成员
7月6日 评论:

验证后确认跟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;
likedislike
zhangliang5
zhangliang5
7月6日 评论:

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

likedislike
Tengda Wu
Tengda Wu成员
7月6日 评论:

这个问题是 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编译选项。

@zhangliang5

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报错。

所以,需合入该补丁修复:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8886640dade4ae2595fcdce511c8bcc716aa47d3

likedislike
PPrithivishS
7月7日 关联了pull request:[OLK-6.6]: SEV-SNP Fix for QEMU startup failure
openeuler-ci-botopeneuler-ci-bot成员
7月9日 关闭了 issue
openeuler-ci-botopeneuler-ci-bot成员
7月9日 issue状态由 待办的 改变为 已完成
openeuler-ci-botopeneuler-ci-bot成员
7月9日 删除了label:DEFECT/UNFIXED
openeuler-ci-bot
openeuler-ci-bot成员
7月9日 评论:

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

likedislike