From nobody Sun Feb 8 13:53:45 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.39 as permitted sender) client-ip=209.132.183.39; envelope-from=libvir-list-bounces@redhat.com; helo=mx6-phx2.redhat.com; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.39 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; Return-Path: Received: from mx6-phx2.redhat.com (mx6-phx2.redhat.com [209.132.183.39]) by mx.zohomail.com with SMTPS id 1488981042716561.3191914600418; Wed, 8 Mar 2017 05:50:42 -0800 (PST) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by mx6-phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v28DlCbX020237; Wed, 8 Mar 2017 08:47:12 -0500 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v28DkW27029148 for ; Wed, 8 Mar 2017 08:46:32 -0500 Received: from virval.usersys.redhat.com (dhcp129-92.brq.redhat.com [10.34.129.92]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v28DkV7t029967 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 8 Mar 2017 08:46:32 -0500 Received: by virval.usersys.redhat.com (Postfix, from userid 500) id 63D10102C16; Wed, 8 Mar 2017 14:46:29 +0100 (CET) From: Jiri Denemark To: libvir-list@redhat.com Date: Wed, 8 Mar 2017 14:46:27 +0100 Message-Id: <43aa335e844ef1c683f9b068f9aa6925b2fedaf4.1488980728.git.jdenemar@redhat.com> In-Reply-To: References: In-Reply-To: References: Mail-Followup-To: libvir-list@redhat.com X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 6/7] qemu: Report better host-model CPUs in domain caps 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: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" One of the main reasons for introducing host-model CPU definition in a domain capabilities XML was the inability to express disabled features in a host capabilities XML. That is, when a host CPU is, e.g., Haswell without x2apic support, host capabilities XML will have to report it as Westmere + a bunch of additional features., but we really want to use Haswell - x2apic when creating a host-model CPU. Unfortunately, I somehow forgot to do the last step and the code would just copy the CPU definition found in the host capabilities XML. This changed recently for new QEMU versions which allow us to query host CPU, but any slightly older QEMU will not benefit from any change I did. This patch makes sure the right CPU model is filled in the domain capabilities even with old QEMU. The issue was reported in https://bugzilla.redhat.com/show_bug.cgi?id=3D1426456 Signed-off-by: Jiri Denemark --- src/qemu/qemu_capabilities.c | 32 ++++++++++++++++++++++++++++---- src/qemu/qemu_capspriv.h | 5 +++++ tests/Makefile.am | 11 +++++++++-- tests/domaincapstest.c | 6 ++++++ tests/qemucpumock.c | 35 +++++++++++++++++++++++++++++++++++ tests/qemuxml2argvtest.c | 6 ++++-- 6 files changed, 87 insertions(+), 8 deletions(-) create mode 100644 tests/qemucpumock.c diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 08c66b088..70f9ed777 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -1074,6 +1074,26 @@ virQEMUCapsProbeHostCPU(virCapsPtr caps) } =20 =20 +virCPUDefPtr +virQEMUCapsProbeHostCPUForEmulator(virCapsPtr caps, + virQEMUCapsPtr qemuCaps, + virDomainVirtType type) +{ + size_t nmodels; + char **models; + virCPUDefPtr cpu; + + if (virQEMUCapsGetCPUDefinitions(qemuCaps, type, &models, &nmodels) < = 0) + return NULL; + + cpu =3D virCPUGetHost(caps->host.arch, VIR_CPU_TYPE_GUEST, NULL, + (const char **) models, nmodels); + + virStringListFreeCount(models, nmodels); + return cpu; +} + + static int virQEMUCapsInitPages(virCapsPtr caps) { @@ -3207,6 +3227,7 @@ virQEMUCapsInitHostCPUModel(virQEMUCapsPtr qemuCaps, virDomainVirtType type) { virCPUDefPtr cpu =3D NULL; + virCPUDefPtr hostCPU =3D NULL; int rc; =20 if (!caps || !virQEMUCapsGuestIsNative(caps->host.arch, qemuCaps->arch= )) @@ -3223,11 +3244,11 @@ virQEMUCapsInitHostCPUModel(virQEMUCapsPtr qemuCaps, if ((rc =3D virQEMUCapsInitCPUModel(qemuCaps, type, cpu)) < 0) { goto error; } else if (rc =3D=3D 1) { - VIR_DEBUG("No host CPU model info from QEMU; using host capabiliti= es"); - if (!caps->host.cpu || !caps->host.cpu->model) - goto error; + VIR_DEBUG("No host CPU model info from QEMU; probing host CPU dire= ctly"); =20 - if (virCPUDefCopyModelFilter(cpu, caps->host.cpu, true, + hostCPU =3D virQEMUCapsProbeHostCPUForEmulator(caps, qemuCaps, typ= e); + if (!hostCPU || + virCPUDefCopyModelFilter(cpu, hostCPU, true, virQEMUCapsCPUFilterFeatures, qemuCaps) < 0) goto error; @@ -3238,11 +3259,14 @@ virQEMUCapsInitHostCPUModel(virQEMUCapsPtr qemuCaps, else qemuCaps->tcgCPUModel =3D cpu; =20 + cleanup: + virCPUDefFree(hostCPU); return; =20 error: virCPUDefFree(cpu); virResetLastError(); + goto cleanup; } =20 =20 diff --git a/src/qemu/qemu_capspriv.h b/src/qemu/qemu_capspriv.h index e0544f273..ee29b8bba 100644 --- a/src/qemu/qemu_capspriv.h +++ b/src/qemu/qemu_capspriv.h @@ -87,4 +87,9 @@ void virQEMUCapsSetCPUModelInfo(virQEMUCapsPtr qemuCaps, virDomainVirtType type, qemuMonitorCPUModelInfoPtr modelInfo); + +virCPUDefPtr +virQEMUCapsProbeHostCPUForEmulator(virCapsPtr caps, + virQEMUCapsPtr qemuCaps, + virDomainVirtType type); #endif diff --git a/tests/Makefile.am b/tests/Makefile.am index 35e82abf5..af69a3a84 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -284,6 +284,7 @@ test_libraries +=3D libqemumonitortestutils.la \ qemuxml2xmlmock.la \ qemucaps2xmlmock.la \ qemucapsprobemock.la \ + qemucpumock.la \ $(NULL) endif WITH_QEMU =20 @@ -549,10 +550,16 @@ libqemutestdriver_la_SOURCES =3D libqemutestdriver_la_LDFLAGS =3D $(QEMULIB_LDFLAGS) libqemutestdriver_la_LIBADD =3D $(qemu_LDADDS) =20 +qemucpumock_la_SOURCES =3D \ + qemucpumock.c +qemucpumock_la_CFLAGS =3D $(AM_CFLAGS) +qemucpumock_la_LDFLAGS =3D $(MOCKLIBS_LDFLAGS) +qemucpumock_la_LIBADD =3D $(MOCKLIBS_LIBS) + qemuxml2argvtest_SOURCES =3D \ qemuxml2argvtest.c testutilsqemu.c testutilsqemu.h \ testutils.c testutils.h -qemuxml2argvtest_LDADD =3D $(qemu_LDADDS) $(LDADDS) $(LIBXML_LIBS) +qemuxml2argvtest_LDADD =3D libqemutestdriver.la $(LDADDS) $(LIBXML_LIBS) =20 qemuxml2argvmock_la_SOURCES =3D \ qemuxml2argvmock.c @@ -949,7 +956,7 @@ domaincapstest_LDADD =3D $(LDADDS) =20 if WITH_QEMU domaincapstest_SOURCES +=3D testutilsqemu.c testutilsqemu.h -domaincapstest_LDADD +=3D $(qemu_LDADDS) $(GNULIB_LIBS) +domaincapstest_LDADD +=3D libqemutestdriver.la $(GNULIB_LIBS) endif WITH_QEMU =20 if WITH_LIBXL diff --git a/tests/domaincapstest.c b/tests/domaincapstest.c index 9b64f2c18..a4bc8d6d0 100644 --- a/tests/domaincapstest.c +++ b/tests/domaincapstest.c @@ -491,4 +491,10 @@ mymain(void) return ret; } =20 +#if WITH_QEMU +VIRT_TEST_MAIN_PRELOAD(mymain, + abs_builddir "/.libs/domaincapsmock.so", + abs_builddir "/.libs/qemucpumock.so") +#else VIRT_TEST_MAIN_PRELOAD(mymain, abs_builddir "/.libs/domaincapsmock.so") +#endif diff --git a/tests/qemucpumock.c b/tests/qemucpumock.c new file mode 100644 index 000000000..2c1d24dd4 --- /dev/null +++ b/tests/qemucpumock.c @@ -0,0 +1,35 @@ +/* + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * . + */ + +#include + +#include "internal.h" +#include "qemu/qemu_capabilities.h" +#define __QEMU_CAPSRIV_H_ALLOW__ +#include "qemu/qemu_capspriv.h" +#undef __QEMU_CAPSRIV_H_ALLOW__ + + +virCPUDefPtr +virQEMUCapsProbeHostCPUForEmulator(virCapsPtr caps, + virQEMUCapsPtr qemuCaps ATTRIBUTE_UNUSE= D, + virDomainVirtType type ATTRIBUTE_UNUSED) +{ + if (!caps || !caps->host.cpu || !caps->host.cpu->model) + return NULL; + + return virCPUDefCopy(caps->host.cpu); +} diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index d2d267fce..018b176c4 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -2476,8 +2476,10 @@ mymain(void) return ret =3D=3D 0 ? EXIT_SUCCESS : EXIT_FAILURE; } =20 -VIRT_TEST_MAIN_PRELOAD(mymain, abs_builddir "/.libs/qemuxml2argvmock.so", - abs_builddir "/.libs/virrandommock.so") +VIRT_TEST_MAIN_PRELOAD(mymain, + abs_builddir "/.libs/qemuxml2argvmock.so", + abs_builddir "/.libs/virrandommock.so", + abs_builddir "/.libs/qemucpumock.so") =20 #else =20 --=20 2.12.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list