[libvirt] [PATCH v2 5/7] qemu: do not create useless <cpu> element

Paolo Bonzini pbonzini at redhat.com
Fri Jan 27 13:49:50 UTC 2012


Avoid creating an empty <cpu> element when the QEMU command-line simply
specifies the default "-cpu qemu32" or "-cpu qemu64".

This requires the previous patch, which lets us represent "-cpu qemu32"
as <os arch='i686'> in the generated XML.

Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>
---
 src/qemu/qemu_command.c |   50 +++++++++++++++++++++++++++++++---------------
 1 files changed, 34 insertions(+), 16 deletions(-)

diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 7fe8c48..d01696e 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -6778,12 +6778,10 @@ static int
 qemuParseCommandLineCPU(virDomainDefPtr dom,
                         const char *val)
 {
-    virCPUDefPtr cpu;
+    virCPUDefPtr cpu = NULL;
     const char *p = val;
     const char *next;
-
-    if (!(cpu = qemuInitGuestCPU(dom)))
-        goto error;
+    char *model = NULL;
 
     do {
         if (*p == '\0' || *p == ',')
@@ -6792,14 +6790,22 @@ qemuParseCommandLineCPU(virDomainDefPtr dom,
         if ((next = strchr(p, ',')))
             next++;
 
-        if (!cpu->model) {
+        if (p == val) {
             if (next)
-                cpu->model = strndup(p, next - p - 1);
+                model = strndup(p, next - p - 1);
             else
-                cpu->model = strdup(p);
+                model = strdup(p);
 
-            if (!cpu->model)
+            if (!model)
                 goto no_memory;
+
+            if (!STREQ(model, "qemu32") && !STREQ(model, "qemu64")) {
+                if (!(cpu = qemuInitGuestCPU(dom)))
+                    goto error;
+
+                cpu->model = model;
+                model = NULL;
+            }
         }
         else if (*p == '+' || *p == '-') {
             char *feature;
@@ -6823,6 +6829,13 @@ qemuParseCommandLineCPU(virDomainDefPtr dom,
             if (!feature)
                 goto no_memory;
 
+            if (!cpu) {
+                if (!(cpu = qemuInitGuestCPU(dom)))
+                    goto error;
+
+                cpu->model = model;
+                model = NULL;
+            }
             ret = virCPUDefAddFeature(cpu, feature, policy);
             VIR_FREE(feature);
             if (ret < 0)
@@ -6832,22 +6845,27 @@ qemuParseCommandLineCPU(virDomainDefPtr dom,
 
     if (STREQ(dom->os.arch, "x86_64")) {
         bool is_32bit = false;
-        union cpuData *cpuData = NULL;
-        int ret;
+        if (cpu) {
+            union cpuData *cpuData = NULL;
+            int ret;
 
-        ret = cpuEncode("x86_64", cpu, NULL, &cpuData,
-                        NULL, NULL, NULL, NULL);
-        if (ret < 0)
-            goto error;
+            ret = cpuEncode("x86_64", cpu, NULL, &cpuData,
+                            NULL, NULL, NULL, NULL);
+            if (ret < 0)
+                goto error;
 
-        is_32bit = (cpuHasFeature("x86_64", cpuData, "lm") != 1);
-        cpuDataFree("x86_64", cpuData);
+            is_32bit = (cpuHasFeature("x86_64", cpuData, "lm") != 1);
+            cpuDataFree("x86_64", cpuData);
+        } else if (model) {
+            is_32bit = STREQ(model, "qemu32");
+        }
 
         if (is_32bit) {
             VIR_FREE(dom->os.arch);
             dom->os.arch = strdup("i686");
         }
     }
+    VIR_FREE(model);
     return 0;
 
 syntax:
-- 
1.7.7.6





More information about the libvir-list mailing list