From nobody Fri Sep 12 20:48:02 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 63.128.21.124 as permitted sender) client-ip=63.128.21.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 63.128.21.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1612964337; cv=none; d=zohomail.com; s=zohoarc; b=B3d6VcPihTDrwKvFQw0vifiHEUihMjoWPVA5ftpWs0jLSiGJmnOlgZubXr1wA5y/gttCDJl5nFYTTchTkrAxFen3Hn8o47tOmK4rZKD6Ev5AtSiCTT1IpllEMMFsCP5h44dPaKFDVYg+126XzlGOguc5mSM21+rCwJNzdk0CWLg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1612964337; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=ByYp9OC0obbrEtNdSsDO/4xo1P3qD58xc56/9xnniJQ=; b=YcvmoQoEVQ/wFSVjYBkwiwZ6zxxiA5qkIcSgr6Q4po3xFG3G4mJGMO1haKmmmQmiJ9tuq5E9c5k0Yq6OX4INZhbKbfUMFsiQqp0r/CXkwqN/NFL0duXeqUZr7LmlswWhjh4DxewgKztNhByQJUs95z0/2kb49fBqkcwKxLlH3Gk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 63.128.21.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by mx.zohomail.com with SMTPS id 161296433717540.81009681353612; Wed, 10 Feb 2021 05:38:57 -0800 (PST) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-536-SPhVPfEHM3GVM88rwS2M6Q-1; Wed, 10 Feb 2021 08:38:53 -0500 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id D24AB107ACC7; Wed, 10 Feb 2021 13:38:47 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id ABDE560BE2; Wed, 10 Feb 2021 13:38:47 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 4A56457DFC; Wed, 10 Feb 2021 13:38:47 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 11ADcQqH014581 for ; Wed, 10 Feb 2021 08:38:26 -0500 Received: by smtp.corp.redhat.com (Postfix) id 48A0D19809; Wed, 10 Feb 2021 13:38:26 +0000 (UTC) Received: from localhost.localdomain (unknown [10.40.194.143]) by smtp.corp.redhat.com (Postfix) with ESMTP id 93D1F1346F; Wed, 10 Feb 2021 13:38:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1612964336; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=ByYp9OC0obbrEtNdSsDO/4xo1P3qD58xc56/9xnniJQ=; b=bsKPSWrnmvurabh8iwtFNlTHtoM2oGxs806iIjvAf4biCRaPSuHilP3GQJ6Bf8WSwJdzUa UTjiMkwEPP/gA1hWQhm5h7rf6XEvC7UesCrY9hUfqyn6ncvN53/4t+tLuIoHt/P6u36438 jWbqQDxt/qrPMZP70vypXX6nf2BaHI4= X-MC-Unique: SPhVPfEHM3GVM88rwS2M6Q-1 From: Michal Privoznik To: libvir-list@redhat.com Subject: [PATCH v3 2/2] qemu: Do not Use canonical path for system memory Date: Wed, 10 Feb 2021 14:38:14 +0100 Message-Id: <2f8a9792942d596195c517c1c06f78c2e2b48bde.1612964123.git.mprivozn@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-loop: libvir-list@redhat.com Cc: imammedo@redhat.com X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" In commit 88957116c9d3cb4705380c3702c9d4315fb500bb I've adapted libvirt to QEMU's deprecation of -mem-path and -mem-prealloc and switched to memory-backend-* even for system memory. My claim was that that's what QEMU does under the hood anyway. And indeed it was: see QEMU commit 900c0ba373aada4c13d47d95330aa72ec4067ba5 and look at function create_default_memdev(). However, then commit d96c4d5f193e0e45beec80a6277728b32875bddb was merged into QEMU. While it was fixing a bug, it also changed the create_default_memdev() function in which it started turning off use of canonical path (by setting "x-use-canonical-path-for-ramblock-id" attribute to false). This wasn't documented until QEMU commit XXX. The path affects migration - the same path has to be used on the source and on the destination. Therefore, if there is old guest started with '-m X' it has "pc.ram" block which doesn't use canonical path and thus when migrating to newer QEMU which uses memory-backend-* we have to turn off the canonical path explicitly. Otherwise, "/objects/pc.ram" path would be expected by QEMU which doesn't match the source. Ideally, we would need to set it only for some machine types (4.0 and older) because newer machine types already do what we are doing. However, we treat machine types as opaque strings and therefore we don't want to parse nor inspect their versions. But then again, newer machine types already do what we are doing in this commit, so when old machine types are deprecated and removed we can remove our hack and forget it ever happened. Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=3D1912201 Signed-off-by: Michal Privoznik Reviewed-by: Peter Krempa --- src/qemu/qemu_command.c | 35 ++++++++++++++++--- src/qemu/qemu_command.h | 3 +- src/qemu/qemu_hotplug.c | 2 +- .../disk-vhostuser.x86_64-latest.args | 3 +- .../hugepages-memaccess3.x86_64-latest.args | 4 +-- 5 files changed, 38 insertions(+), 9 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 92036d26c0..699d89de1d 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -2975,7 +2975,8 @@ qemuBuildMemoryBackendProps(virJSONValuePtr *backendP= rops, qemuDomainObjPrivatePtr priv, const virDomainDef *def, const virDomainMemoryDef *mem, - bool force) + bool force, + bool systemMemory) { const char *backendType =3D "memory-backend-file"; virDomainNumatuneMemMode mode; @@ -2992,6 +2993,10 @@ qemuBuildMemoryBackendProps(virJSONValuePtr *backend= Props, bool needHugepage =3D !!pagesize; bool useHugepage =3D !!pagesize; int discard =3D mem->discard; + bool disableCanonicalPath =3D false; + + /* Disabling canonical path is required for migration compatibility of + * system memory objects, see below */ =20 /* The difference between @needHugepage and @useHugepage is that the l= atter * is true whenever huge page is defined for the current memory cell. @@ -3106,6 +3111,9 @@ qemuBuildMemoryBackendProps(virJSONValuePtr *backendP= rops, if (qemuBuildMemoryBackendPropsShare(props, memAccess) < 0) return -1; =20 + if (systemMemory) + disableCanonicalPath =3D true; + } else if (useHugepage || mem->nvdimmPath || memAccess || def->mem.source =3D=3D VIR_DOMAIN_MEMORY_SOURCE_FILE) { =20 @@ -3148,10 +3156,29 @@ qemuBuildMemoryBackendProps(virJSONValuePtr *backen= dProps, =20 if (qemuBuildMemoryBackendPropsShare(props, memAccess) < 0) return -1; + + if (systemMemory) + disableCanonicalPath =3D true; + } else { backendType =3D "memory-backend-ram"; } =20 + /* This is a terrible hack, but unfortunately there is no better way. + * The replacement for '-m X' argument is not simple '-machine + * memory-backend' and '-object memory-backend-*,size=3DX' (which was = the + * idea). This is because of create_default_memdev() in QEMU sets + * 'x-use-canonical-path-for-ramblock-id' attribute to false and is + * documented in QEMU in qemu-options.hx under 'memory-backend'. Note + * that QEMU consideres 'x-use-canonical-path-for-ramblock-id' stable + * and supported despite the 'x-' prefix. + * See QEMU commit 8db0b20415c129cf5e577a593a4a0372d90b7cc9. + */ + if (disableCanonicalPath && + virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_X_USE_CANONICAL_PATH_FOR_= RAMBLOCK_ID) && + virJSONValueObjectAdd(props, "b:x-use-canonical-path-for-ramblock-= id", false, NULL) < 0) + return -1; + if (!priv->memPrealloc && virJSONValueObjectAdd(props, "B:prealloc", prealloc, NULL) < 0) return -1; @@ -3263,7 +3290,7 @@ qemuBuildMemoryCellBackendStr(virDomainDefPtr def, mem.info.alias =3D alias; =20 if ((rc =3D qemuBuildMemoryBackendProps(&props, alias, cfg, - priv, def, &mem, false)) < 0) + priv, def, &mem, false, false)) = < 0) return -1; =20 if (virQEMUBuildObjectCommandlineFromJSON(buf, props) < 0) @@ -3292,7 +3319,7 @@ qemuBuildMemoryDimmBackendStr(virBufferPtr buf, alias =3D g_strdup_printf("mem%s", mem->info.alias); =20 if (qemuBuildMemoryBackendProps(&props, alias, cfg, - priv, def, mem, true) < 0) + priv, def, mem, true, false) < 0) return -1; =20 if (virQEMUBuildObjectCommandlineFromJSON(buf, props) < 0) @@ -7100,7 +7127,7 @@ qemuBuildMemCommandLineMemoryDefaultBackend(virComman= dPtr cmd, mem.info.alias =3D (char *) defaultRAMid; =20 if (qemuBuildMemoryBackendProps(&props, defaultRAMid, cfg, - priv, def, &mem, false) < 0) + priv, def, &mem, false, true) < 0) return -1; =20 if (virQEMUBuildObjectCommandlineFromJSON(&buf, props) < 0) diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h index a33fbf6f4e..bdae117e02 100644 --- a/src/qemu/qemu_command.h +++ b/src/qemu/qemu_command.h @@ -161,7 +161,8 @@ int qemuBuildMemoryBackendProps(virJSONValuePtr *backen= dProps, qemuDomainObjPrivatePtr priv, const virDomainDef *def, const virDomainMemoryDef *mem, - bool force); + bool force, + bool systemMemory); =20 char * qemuBuildMemoryDeviceStr(const virDomainDef *def, diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index dc2b46057c..e7863328db 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -2430,7 +2430,7 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver, goto cleanup; =20 if (qemuBuildMemoryBackendProps(&props, objalias, cfg, - priv, vm->def, mem, true) < 0) + priv, vm->def, mem, true, false) < 0) goto cleanup; =20 if (qemuProcessBuildDestroyMemoryPaths(driver, vm, mem, true) < 0) diff --git a/tests/qemuxml2argvdata/disk-vhostuser.x86_64-latest.args b/tes= ts/qemuxml2argvdata/disk-vhostuser.x86_64-latest.args index 30acd7c78b..9ee855d5c7 100644 --- a/tests/qemuxml2argvdata/disk-vhostuser.x86_64-latest.args +++ b/tests/qemuxml2argvdata/disk-vhostuser.x86_64-latest.args @@ -15,7 +15,8 @@ file=3D/tmp/lib/domain--1-QEMUGuest1/master-key.aes \ -machine pc,accel=3Dtcg,usb=3Doff,dump-guest-core=3Doff,memory-backend=3Dp= c.ram \ -cpu qemu64 \ -m 214 \ --object memory-backend-memfd,id=3Dpc.ram,share=3Dyes,size=3D224395264 \ +-object memory-backend-memfd,id=3Dpc.ram,share=3Dyes,\ +x-use-canonical-path-for-ramblock-id=3Dno,size=3D224395264 \ -overcommit mem-lock=3Doff \ -smp 1,sockets=3D1,cores=3D1,threads=3D1 \ -uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ diff --git a/tests/qemuxml2argvdata/hugepages-memaccess3.x86_64-latest.args= b/tests/qemuxml2argvdata/hugepages-memaccess3.x86_64-latest.args index 6033950eab..9396441b92 100644 --- a/tests/qemuxml2argvdata/hugepages-memaccess3.x86_64-latest.args +++ b/tests/qemuxml2argvdata/hugepages-memaccess3.x86_64-latest.args @@ -19,8 +19,8 @@ arch-capabilities=3Don,ssbd=3Don,xsaves=3Don,cmp-legacy= =3Don,amd-ssbd=3Don,virt-ssbd=3Don,\ rdctl-no=3Don,skip-l1dfl-vmentry=3Don,mds-no=3Don,pschange-mc-no=3Don \ -m 4096 \ -object memory-backend-file,id=3Dpc.ram,\ -mem-path=3D/dev/hugepages2M/libvirt/qemu/-1-fedora,share=3Dyes,prealloc=3D= yes,\ -size=3D4294967296 \ +mem-path=3D/dev/hugepages2M/libvirt/qemu/-1-fedora,share=3Dyes,\ +x-use-canonical-path-for-ramblock-id=3Dno,prealloc=3Dyes,size=3D4294967296= \ -overcommit mem-lock=3Doff \ -smp 4,sockets=3D4,cores=3D1,threads=3D1 \ -uuid 63840878-0deb-4095-97e6-fc444d9bc9fa \ --=20 2.26.2