]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: cache host arch separately from virCapsPtr
authorDaniel P. Berrangé <berrange@redhat.com>
Tue, 26 Nov 2019 17:51:22 +0000 (17:51 +0000)
committerDaniel P. Berrangé <berrange@redhat.com>
Mon, 9 Dec 2019 10:15:15 +0000 (10:15 +0000)
As part of a goal to eliminate the need to use virCapsPtr for anything
other than the virConnectGetCapabilies() API impl, cache the host arch
against the QEMU driver struct and use that field directly.

In the tests we move virArchFromHost() globally in testutils.c so that
every test runs with a fixed default architecture reported.

Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
15 files changed:
src/qemu/qemu_capabilities.c
src/qemu/qemu_capabilities.h
src/qemu/qemu_command.c
src/qemu/qemu_conf.c
src/qemu/qemu_conf.h
src/qemu/qemu_domain.c
src/qemu/qemu_driver.c
src/qemu/qemu_process.c
tests/domaincapstest.c
tests/qemumemlocktest.c
tests/qemuxml2argvtest.c
tests/testutils.c
tests/testutils.h
tests/testutilsqemu.c
tests/testutilsqemu.h

index edb128c8811e6054c833007d50f9ec5b24e50302..cfc16ba63e47974ef5a342ca8cbae9fa610b02dc 100644 (file)
@@ -2096,7 +2096,7 @@ virQEMUCapsSetHostModel(virQEMUCapsPtr qemuCaps,
 
 bool
 virQEMUCapsIsCPUModeSupported(virQEMUCapsPtr qemuCaps,
-                              virCapsPtr caps,
+                              virArch hostarch,
                               virDomainVirtType type,
                               virCPUMode mode)
 {
@@ -2105,7 +2105,7 @@ virQEMUCapsIsCPUModeSupported(virQEMUCapsPtr qemuCaps,
     switch (mode) {
     case VIR_CPU_MODE_HOST_PASSTHROUGH:
         return type == VIR_DOMAIN_VIRT_KVM &&
-               virQEMUCapsGuestIsNative(caps->host.arch, qemuCaps->arch);
+               virQEMUCapsGuestIsNative(hostarch, qemuCaps->arch);
 
     case VIR_CPU_MODE_HOST_MODEL:
         return !!virQEMUCapsGetHostModel(qemuCaps, type,
@@ -5412,22 +5412,22 @@ virQEMUCapsFillDomainOSCaps(virDomainCapsOSPtr os,
 
 
 static void
-virQEMUCapsFillDomainCPUCaps(virCapsPtr caps,
-                             virQEMUCapsPtr qemuCaps,
+virQEMUCapsFillDomainCPUCaps(virQEMUCapsPtr qemuCaps,
+                             virArch hostarch,
                              virDomainCapsPtr domCaps)
 {
-    if (virQEMUCapsIsCPUModeSupported(qemuCaps, caps, domCaps->virttype,
+    if (virQEMUCapsIsCPUModeSupported(qemuCaps, hostarch, domCaps->virttype,
                                       VIR_CPU_MODE_HOST_PASSTHROUGH))
         domCaps->cpu.hostPassthrough = true;
 
-    if (virQEMUCapsIsCPUModeSupported(qemuCaps, caps, domCaps->virttype,
+    if (virQEMUCapsIsCPUModeSupported(qemuCaps, hostarch, domCaps->virttype,
                                       VIR_CPU_MODE_HOST_MODEL)) {
         virCPUDefPtr cpu = virQEMUCapsGetHostModel(qemuCaps, domCaps->virttype,
                                                    VIR_QEMU_CAPS_HOST_CPU_REPORTED);
         domCaps->cpu.hostModel = virCPUDefCopy(cpu);
     }
 
-    if (virQEMUCapsIsCPUModeSupported(qemuCaps, caps, domCaps->virttype,
+    if (virQEMUCapsIsCPUModeSupported(qemuCaps, hostarch, domCaps->virttype,
                                       VIR_CPU_MODE_CUSTOM)) {
         const char *blacklist[] = { "host", NULL };
         VIR_AUTOSTRINGLIST models = NULL;
@@ -5746,9 +5746,9 @@ virQEMUCapsFillDomainFeatureSEVCaps(virQEMUCapsPtr qemuCaps,
 
 
 int
-virQEMUCapsFillDomainCaps(virCapsPtr caps,
+virQEMUCapsFillDomainCaps(virQEMUCapsPtr qemuCaps,
+                          virArch hostarch,
                           virDomainCapsPtr domCaps,
-                          virQEMUCapsPtr qemuCaps,
                           bool privileged,
                           virFirmwarePtr *firmwares,
                           size_t nfirmwares)
@@ -5781,7 +5781,7 @@ virQEMUCapsFillDomainCaps(virCapsPtr caps,
                                     firmwares, nfirmwares) < 0)
         return -1;
 
-    virQEMUCapsFillDomainCPUCaps(caps, qemuCaps, domCaps);
+    virQEMUCapsFillDomainCPUCaps(qemuCaps, hostarch, domCaps);
     virQEMUCapsFillDomainDeviceDiskCaps(qemuCaps, domCaps->machine, disk);
     virQEMUCapsFillDomainDeviceGraphicsCaps(qemuCaps, graphics);
     virQEMUCapsFillDomainDeviceVideoCaps(qemuCaps, video);
index 4d7d836e8c32f082181616413be274f895ddb96e..399496796dc22b58d5c5c87e5d7ea42c921a5900 100644 (file)
@@ -604,7 +604,7 @@ int virQEMUCapsGetCPUFeatures(virQEMUCapsPtr qemuCaps,
                               char ***features);
 
 bool virQEMUCapsIsCPUModeSupported(virQEMUCapsPtr qemuCaps,
-                                   virCapsPtr caps,
+                                   virArch hostarch,
                                    virDomainVirtType type,
                                    virCPUMode mode);
 const char *virQEMUCapsGetCanonicalMachine(virQEMUCapsPtr qemuCaps,
@@ -665,9 +665,9 @@ int virQEMUCapsInitGuestFromBinary(virCapsPtr caps,
                                    virQEMUCapsPtr qemuCaps,
                                    virArch guestarch);
 
-int virQEMUCapsFillDomainCaps(virCapsPtr caps,
+int virQEMUCapsFillDomainCaps(virQEMUCapsPtr qemuCaps,
+                              virArch hostarch,
                               virDomainCapsPtr domCaps,
-                              virQEMUCapsPtr qemuCaps,
                               bool privileged,
                               virFirmwarePtr *firmwares,
                               size_t nfirmwares);
index 3465d28b844183e34bdad35757a9ced7aa918d23..49a0dad8d41db45df14f685dcd55b68841684541 100644 (file)
@@ -6657,18 +6657,14 @@ qemuBuildCpuModelArgStr(virQEMUDriverPtr driver,
                         virQEMUCapsPtr qemuCaps)
 {
     size_t i;
-    g_autoptr(virCaps) caps = NULL;
     virCPUDefPtr cpu = def->cpu;
 
-    if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
-        return -1;
-
     switch ((virCPUMode) cpu->mode) {
     case VIR_CPU_MODE_HOST_PASSTHROUGH:
         virBufferAddLit(buf, "host");
 
         if (def->os.arch == VIR_ARCH_ARMV7L &&
-            caps->host.arch == VIR_ARCH_AARCH64) {
+            driver->hostarch == VIR_ARCH_AARCH64) {
             if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CPU_AARCH64_OFF)) {
                 virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                                _("QEMU binary does not support CPU "
index 30637b21ac632cc289afbbc320973c91f0ec224c..53658c80e8bb01619e3e6dc4241e6778b9d3b26e 100644 (file)
@@ -1341,7 +1341,6 @@ virQEMUDriverGetDomainCapabilities(virQEMUDriverPtr driver,
                                    virDomainVirtType virttype)
 {
     g_autoptr(virDomainCaps) domCaps = NULL;
-    g_autoptr(virCaps) caps = NULL;
     g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
     virHashTablePtr domCapsCache = virQEMUCapsGetDomainCapsCache(qemuCaps);
     struct virQEMUDriverSearchDomcapsData data = {
@@ -1351,9 +1350,6 @@ virQEMUDriverGetDomainCapabilities(virQEMUDriverPtr driver,
         .virttype = virttype,
     };
 
-    if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
-        return NULL;
-
     domCaps = virHashSearch(domCapsCache,
                             virQEMUDriverSearchDomcaps, &data, NULL);
     if (!domCaps) {
@@ -1364,7 +1360,7 @@ virQEMUDriverGetDomainCapabilities(virQEMUDriverPtr driver,
                                          data.arch, data.virttype)))
             return NULL;
 
-        if (virQEMUCapsFillDomainCaps(caps, domCaps, qemuCaps,
+        if (virQEMUCapsFillDomainCaps(qemuCaps, driver->hostarch, domCaps,
                                       driver->privileged,
                                       cfg->firmwares, cfg->nfirmwares) < 0)
             return NULL;
index 95b33a1093b4ce98c0fb9dd4ae28ba623ca7cbcc..7c56226b8c9aca0021cea354c7fe2de7b993bb15 100644 (file)
@@ -262,6 +262,9 @@ struct _virQEMUDriver {
      */
     virCapsPtr caps;
 
+    /* Immutable value */
+    virArch hostarch;
+
     /* Immutable pointer, Immutable object */
     virDomainXMLOptionPtr xmlopt;
 
index 7ab7543ab15afbcec25d5ed60157dcb18ac98ffc..9d945733545d484b0641326d994bde98c6ef9748 100644 (file)
@@ -4446,7 +4446,7 @@ qemuDomainDefVcpusPostParse(virDomainDefPtr def)
 
 static int
 qemuDomainDefSetDefaultCPU(virDomainDefPtr def,
-                           virCapsPtr caps,
+                           virArch hostarch,
                            virQEMUCapsPtr qemuCaps)
 {
     const char *model;
@@ -4484,7 +4484,7 @@ qemuDomainDefSetDefaultCPU(virDomainDefPtr def,
 
     if (STREQ(model, "host")) {
         if (ARCH_IS_S390(def->os.arch) &&
-            virQEMUCapsIsCPUModeSupported(qemuCaps, caps, def->virtType,
+            virQEMUCapsIsCPUModeSupported(qemuCaps, hostarch, def->virtType,
                                           VIR_CPU_MODE_HOST_MODEL)) {
             def->cpu->mode = VIR_CPU_MODE_HOST_MODEL;
         } else {
@@ -4691,7 +4691,7 @@ qemuDomainDefPostParseBasic(virDomainDefPtr def,
 
 static int
 qemuDomainDefPostParse(virDomainDefPtr def,
-                       virCapsPtr caps,
+                       virCapsPtr caps G_GNUC_UNUSED,
                        unsigned int parseFlags,
                        void *opaque,
                        void *parseOpaque)
@@ -4723,7 +4723,7 @@ qemuDomainDefPostParse(virDomainDefPtr def,
     if (qemuCanonicalizeMachine(def, qemuCaps) < 0)
         return -1;
 
-    if (qemuDomainDefSetDefaultCPU(def, caps, qemuCaps) < 0)
+    if (qemuDomainDefSetDefaultCPU(def, driver->hostarch, qemuCaps) < 0)
         return -1;
 
     qemuDomainDefEnableDefaultFeatures(def, qemuCaps);
index 738e8832ccbe4450d13b61d8a50bfb1d501b29f3..15d5d5539879c2d3760c58b2f8f9397f93c01177 100644 (file)
@@ -673,6 +673,7 @@ qemuStateInitialize(bool privileged,
     qemu_driver->inhibitOpaque = opaque;
 
     qemu_driver->privileged = privileged;
+    qemu_driver->hostarch = virArchFromHost();
 
     if (!(qemu_driver->domains = virDomainObjListNew()))
         goto error;
@@ -13424,7 +13425,7 @@ qemuConnectCompareCPU(virConnectPtr conn,
     if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
         return VIR_CPU_COMPARE_ERROR;
 
-    return virCPUCompareXML(caps->host.arch, caps->host.cpu,
+    return virCPUCompareXML(driver->hostarch, caps->host.cpu,
                             xmlDesc, failIncompatible);
 }
 
index 5e178b3c6c4dceffce502bea53de33e7b4e61731..7987e45114e19f47be8372726a1d041decc1d409 100644 (file)
@@ -6047,7 +6047,7 @@ qemuProcessDropUnknownCPUFeatures(const char *name,
 static int
 qemuProcessUpdateGuestCPU(virDomainDefPtr def,
                           virQEMUCapsPtr qemuCaps,
-                          virCapsPtr caps,
+                          virArch hostarch,
                           unsigned int flags)
 {
     if (!def->cpu)
@@ -6069,7 +6069,7 @@ qemuProcessUpdateGuestCPU(virDomainDefPtr def,
         def->cpu->mode = VIR_CPU_MODE_CUSTOM;
     }
 
-    if (!virQEMUCapsIsCPUModeSupported(qemuCaps, caps, def->virtType,
+    if (!virQEMUCapsIsCPUModeSupported(qemuCaps, hostarch, def->virtType,
                                        def->cpu->mode)) {
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                        _("CPU mode '%s' for %s %s domain on %s host is not "
@@ -6077,11 +6077,11 @@ qemuProcessUpdateGuestCPU(virDomainDefPtr def,
                        virCPUModeTypeToString(def->cpu->mode),
                        virArchToString(def->os.arch),
                        virDomainVirtTypeToString(def->virtType),
-                       virArchToString(caps->host.arch));
+                       virArchToString(hostarch));
         return -1;
     }
 
-    if (virCPUConvertLegacy(caps->host.arch, def->cpu) < 0)
+    if (virCPUConvertLegacy(hostarch, def->cpu) < 0)
         return -1;
 
     /* nothing to update for host-passthrough */
@@ -6089,7 +6089,7 @@ qemuProcessUpdateGuestCPU(virDomainDefPtr def,
         g_autoptr(virDomainCapsCPUModels) cpuModels = NULL;
 
         if (def->cpu->check == VIR_CPU_CHECK_PARTIAL &&
-            virCPUCompare(caps->host.arch,
+            virCPUCompare(hostarch,
                           virQEMUCapsGetHostModel(qemuCaps, def->virtType,
                                                   VIR_QEMU_CAPS_HOST_CPU_FULL),
                           def->cpu, true) < 0)
@@ -6351,7 +6351,7 @@ qemuProcessPrepareDomain(virQEMUDriverPtr driver,
     priv->pausedReason = VIR_DOMAIN_PAUSED_UNKNOWN;
 
     VIR_DEBUG("Updating guest CPU definition");
-    if (qemuProcessUpdateGuestCPU(vm->def, priv->qemuCaps, caps, flags) < 0)
+    if (qemuProcessUpdateGuestCPU(vm->def, priv->qemuCaps, driver->hostarch, flags) < 0)
         goto cleanup;
 
     for (i = 0; i < vm->def->nshmems; i++)
@@ -7827,7 +7827,7 @@ qemuProcessRefreshCPU(virQEMUDriverPtr driver,
     if (!caps)
         return -1;
 
-    if (!virQEMUCapsGuestIsNative(caps->host.arch, vm->def->os.arch) ||
+    if (!virQEMUCapsGuestIsNative(driver->hostarch, vm->def->os.arch) ||
         !caps->host.cpu ||
         !vm->def->cpu) {
         ret = 0;
index c6700f7e781b94c69311b903c6a5e30318870482..94e58317069a685a408ec8f6d0bdfcb931068747 100644 (file)
@@ -106,7 +106,7 @@ fillQemuCaps(virDomainCapsPtr domCaps,
     if (!domCaps->machine)
         domCaps->machine = g_strdup(virQEMUCapsGetPreferredMachine(qemuCaps, virtType));
 
-    if (virQEMUCapsFillDomainCaps(caps, domCaps, qemuCaps,
+    if (virQEMUCapsFillDomainCaps(qemuCaps, caps->host.arch, domCaps,
                                   false,
                                   cfg->firmwares,
                                   cfg->nfirmwares) < 0)
index ef3bfa0345750e639098ed6e887ff8c3dd3157ad..55f65dcb6acf179726a2908e33bb2e161bfd961c 100644 (file)
@@ -101,7 +101,7 @@ mymain(void)
      * ensure settings are prioritized as expected.
      */
 
-    qemuTestSetHostArch(driver.caps, VIR_ARCH_X86_64);
+    qemuTestSetHostArch(&driver, VIR_ARCH_X86_64);
 
     DO_TEST("pc-kvm", 0);
     DO_TEST("pc-tcg", 0);
@@ -115,7 +115,7 @@ mymain(void)
     DO_TEST("pc-hardlimit+locked+hostdev", 2147483648);
     DO_TEST("pc-locked+hostdev", VIR_DOMAIN_MEMORY_PARAM_UNLIMITED);
 
-    qemuTestSetHostArch(driver.caps, VIR_ARCH_PPC64);
+    qemuTestSetHostArch(&driver, VIR_ARCH_PPC64);
     if (!(qemuCaps = virQEMUCapsNew())) {
         ret = -1;
         goto cleanup;
index 86b8899921c8cb59d1f1c44ac35a82bc2a886b99..546cdae245a88999bd0fd152678338f2914d1852 100644 (file)
@@ -413,7 +413,7 @@ testCompareXMLToArgv(const void *data)
     qemuDomainObjPrivatePtr priv = NULL;
 
     if (info->arch != VIR_ARCH_NONE && info->arch != VIR_ARCH_X86_64)
-        qemuTestSetHostArch(driver.caps, info->arch);
+        qemuTestSetHostArch(&driver, info->arch);
 
     memset(&monitor_chr, 0, sizeof(monitor_chr));
 
@@ -584,7 +584,7 @@ testCompareXMLToArgv(const void *data)
     virObjectUnref(conn);
     VIR_FREE(migrateURI);
     if (info->arch != VIR_ARCH_NONE && info->arch != VIR_ARCH_X86_64)
-        qemuTestSetHostArch(driver.caps, VIR_ARCH_NONE);
+        qemuTestSetHostArch(&driver, VIR_ARCH_NONE);
 
     return ret;
 }
@@ -1724,11 +1724,11 @@ mymain(void)
     DO_TEST("cpu-host-passthrough", QEMU_CAPS_KVM);
     DO_TEST_FAILURE("cpu-qemu-host-passthrough", QEMU_CAPS_KVM);
 
-    qemuTestSetHostArch(driver.caps, VIR_ARCH_S390X);
+    qemuTestSetHostArch(&driver, VIR_ARCH_S390X);
     DO_TEST("cpu-s390-zEC12", QEMU_CAPS_KVM, QEMU_CAPS_CCW, QEMU_CAPS_VIRTIO_S390);
     DO_TEST("cpu-s390-features", QEMU_CAPS_KVM, QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION);
     DO_TEST_FAILURE("cpu-s390-features", QEMU_CAPS_KVM);
-    qemuTestSetHostArch(driver.caps, VIR_ARCH_NONE);
+    qemuTestSetHostArch(&driver, VIR_ARCH_NONE);
 
     qemuTestSetHostCPU(driver.caps, cpuHaswell);
     DO_TEST("cpu-Haswell", QEMU_CAPS_KVM);
@@ -1855,7 +1855,7 @@ mymain(void)
             QEMU_CAPS_DEVICE_SPAPR_VTY);
     DO_TEST_PARSE_ERROR("pseries-no-parallel", NONE);
 
-    qemuTestSetHostArch(driver.caps, VIR_ARCH_PPC64);
+    qemuTestSetHostArch(&driver, VIR_ARCH_PPC64);
     DO_TEST("pseries-cpu-compat", QEMU_CAPS_KVM,
             QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE,
             QEMU_CAPS_DEVICE_SPAPR_VTY);
@@ -1877,7 +1877,7 @@ mymain(void)
             QEMU_CAPS_DEVICE_SPAPR_VTY);
     qemuTestSetHostCPU(driver.caps, NULL);
 
-    qemuTestSetHostArch(driver.caps, VIR_ARCH_NONE);
+    qemuTestSetHostArch(&driver, VIR_ARCH_NONE);
 
     DO_TEST("pseries-panic-missing",
             QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE,
@@ -2552,7 +2552,7 @@ mymain(void)
             QEMU_CAPS_DEVICE_VIRTIO_RNG, QEMU_CAPS_OBJECT_RNG_RANDOM);
     DO_TEST("aarch64-virt-default-nic",
             QEMU_CAPS_DEVICE_VIRTIO_MMIO);
-    qemuTestSetHostArch(driver.caps, VIR_ARCH_AARCH64);
+    qemuTestSetHostArch(&driver, VIR_ARCH_AARCH64);
     DO_TEST("aarch64-cpu-passthrough",
             QEMU_CAPS_DEVICE_VIRTIO_MMIO,
             QEMU_CAPS_KVM);
@@ -2668,7 +2668,7 @@ mymain(void)
     /* SVE aarch64 CPU features work on modern QEMU */
     DO_TEST_CAPS_ARCH_LATEST("aarch64-features-sve", "aarch64");
 
-    qemuTestSetHostArch(driver.caps, VIR_ARCH_NONE);
+    qemuTestSetHostArch(&driver, VIR_ARCH_NONE);
 
     DO_TEST("kvm-pit-delay", QEMU_CAPS_KVM_PIT_TICK_POLICY);
     DO_TEST("kvm-pit-discard", QEMU_CAPS_KVM_PIT_TICK_POLICY);
index b3ca2c5b3e95f0ab62a3c33aa2050c5f2764d926..3ff582d70f481df7981fd9e775ead2c21c22335c 100644 (file)
@@ -60,6 +60,15 @@ static virBitmapPtr testBitmap;
 char *progname;
 static char *python;
 
+virArch virTestHostArch = VIR_ARCH_X86_64;
+
+virArch
+virArchFromHost(void)
+{
+    return virTestHostArch;
+}
+
+
 static int virTestUseTerminalColors(void)
 {
     return isatty(STDOUT_FILENO);
index 76090c5522bf1bf3e680facae75d4e34601f8941..c3f2cee85f04adc8e87509e433c1575bd017c4a7 100644 (file)
@@ -43,6 +43,8 @@ extern char *progname;
 # error Fix Makefile.am
 #endif
 
+extern virArch virTestHostArch;
+
 int virTestRun(const char *title,
                int (*body)(const void *data),
                const void *data);
index 4cb128559a71f2822700c930b721e67e731ce206..97f63e7d5d4f4ec0e803e90ac1dd0af27b144f5a 100644 (file)
@@ -576,13 +576,16 @@ virCapsPtr testQemuCapsInit(void)
 
 
 void
-qemuTestSetHostArch(virCapsPtr caps,
+qemuTestSetHostArch(virQEMUDriverPtr driver,
                     virArch arch)
 {
     if (arch == VIR_ARCH_NONE)
         arch = VIR_ARCH_X86_64;
-    caps->host.arch = arch;
-    qemuTestSetHostCPU(caps, NULL);
+
+    virTestHostArch = arch;
+    driver->hostarch = virArchFromHost();
+    driver->caps->host.arch = virArchFromHost();
+    qemuTestSetHostCPU(driver->caps, NULL);
 }
 
 
@@ -694,6 +697,8 @@ int qemuTestDriverInit(virQEMUDriver *driver)
     if (virMutexInit(&driver->lock) < 0)
         return -1;
 
+    driver->hostarch = virArchFromHost();
+
     driver->config = virQEMUDriverConfigNew(false);
     if (!driver->config)
         goto error;
index da3bf3ab7ad8159cb194cae4c5b9e432e5533c22..8dcc930ac3701f364aec1d8d7199595afa20daee 100644 (file)
@@ -80,8 +80,8 @@ extern virCPUDefPtr cpuHaswell;
 extern virCPUDefPtr cpuPower8;
 extern virCPUDefPtr cpuPower9;
 
-void qemuTestSetHostArch(virCapsPtr caps,
-                        virArch arch);
+void qemuTestSetHostArch(virQEMUDriverPtr driver,
+                         virArch arch);
 void qemuTestSetHostCPU(virCapsPtr caps,
                         virCPUDefPtr cpu);