diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 08c66b0880f6f85763fe231d1541d74bfe81a3ca..70f9ed777aa707d9299501df8bee789304075156 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -1074,6 +1074,26 @@ virQEMUCapsProbeHostCPU(virCapsPtr caps) } +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 = 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 = NULL; + virCPUDefPtr hostCPU = NULL; int rc; if (!caps || !virQEMUCapsGuestIsNative(caps->host.arch, qemuCaps->arch)) @@ -3223,11 +3244,11 @@ virQEMUCapsInitHostCPUModel(virQEMUCapsPtr qemuCaps, if ((rc = virQEMUCapsInitCPUModel(qemuCaps, type, cpu)) < 0) { goto error; } else if (rc == 1) { - VIR_DEBUG("No host CPU model info from QEMU; using host capabilities"); - if (!caps->host.cpu || !caps->host.cpu->model) - goto error; + VIR_DEBUG("No host CPU model info from QEMU; probing host CPU directly"); - if (virCPUDefCopyModelFilter(cpu, caps->host.cpu, true, + hostCPU = virQEMUCapsProbeHostCPUForEmulator(caps, qemuCaps, type); + if (!hostCPU || + virCPUDefCopyModelFilter(cpu, hostCPU, true, virQEMUCapsCPUFilterFeatures, qemuCaps) < 0) goto error; @@ -3238,11 +3259,14 @@ virQEMUCapsInitHostCPUModel(virQEMUCapsPtr qemuCaps, else qemuCaps->tcgCPUModel = cpu; + cleanup: + virCPUDefFree(hostCPU); return; error: virCPUDefFree(cpu); virResetLastError(); + goto cleanup; } diff --git a/src/qemu/qemu_capspriv.h b/src/qemu/qemu_capspriv.h index e0544f273b2ef37e296f227bfb1f35b81fa9e931..ee29b8bba71e5539f4783288b7f0523b92b7bf01 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 35e82abf5f53fa55f7fa4a993b849e8ee1991014..af69a3a843a531b5567aa057631bd05dd73698e8 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -284,6 +284,7 @@ test_libraries += libqemumonitortestutils.la \ qemuxml2xmlmock.la \ qemucaps2xmlmock.la \ qemucapsprobemock.la \ + qemucpumock.la \ $(NULL) endif WITH_QEMU @@ -549,10 +550,16 @@ libqemutestdriver_la_SOURCES = libqemutestdriver_la_LDFLAGS = $(QEMULIB_LDFLAGS) libqemutestdriver_la_LIBADD = $(qemu_LDADDS) +qemucpumock_la_SOURCES = \ + qemucpumock.c +qemucpumock_la_CFLAGS = $(AM_CFLAGS) +qemucpumock_la_LDFLAGS = $(MOCKLIBS_LDFLAGS) +qemucpumock_la_LIBADD = $(MOCKLIBS_LIBS) + qemuxml2argvtest_SOURCES = \ qemuxml2argvtest.c testutilsqemu.c testutilsqemu.h \ testutils.c testutils.h -qemuxml2argvtest_LDADD = $(qemu_LDADDS) $(LDADDS) $(LIBXML_LIBS) +qemuxml2argvtest_LDADD = libqemutestdriver.la $(LDADDS) $(LIBXML_LIBS) qemuxml2argvmock_la_SOURCES = \ qemuxml2argvmock.c @@ -949,7 +956,7 @@ domaincapstest_LDADD = $(LDADDS) if WITH_QEMU domaincapstest_SOURCES += testutilsqemu.c testutilsqemu.h -domaincapstest_LDADD += $(qemu_LDADDS) $(GNULIB_LIBS) +domaincapstest_LDADD += libqemutestdriver.la $(GNULIB_LIBS) endif WITH_QEMU if WITH_LIBXL diff --git a/tests/domaincapstest.c b/tests/domaincapstest.c index 9b64f2c18a46ffa51d0b8f098620d5d8c0f7bdf9..a4bc8d6d0d719df7fdb9fecbde43d73d116ac789 100644 --- a/tests/domaincapstest.c +++ b/tests/domaincapstest.c @@ -491,4 +491,10 @@ mymain(void) return ret; } +#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 0000000000000000000000000000000000000000..2c1d24dd4781ac3ede0c46e623702f12ba5b2c05 --- /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_UNUSED, + 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 00b0e25cdab1c5f6758197b2338a72e098145fe7..6bd74659926673d824b17b241b75e164e58df71b 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -2473,8 +2473,10 @@ mymain(void) return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; } -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") #else