File ea51e6a0-cpu_x86-Compare-CPU-candidates-in-a-separate-functio.patch of Package libvirt.11695

From ea51e6a04550422d92aa9421f6dc61436f8302fc Mon Sep 17 00:00:00 2001
From: Jiri Denemark <jdenemar@redhat.com>
Date: Thu, 12 May 2016 14:50:17 +0200
Subject: [PATCH] cpu_x86: Compare CPU candidates in a separate function

Splitting the comparison into a separate function makes the code cleaner
and easier to update in the future.

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
---
 src/cpu/cpu_x86.c | 65 ++++++++++++++++++++++++++++++++++++-------------------
 1 file changed, 43 insertions(+), 22 deletions(-)

Index: libvirt-1.2.5/src/cpu/cpu_x86.c
===================================================================
--- libvirt-1.2.5.orig/src/cpu/cpu_x86.c
+++ libvirt-1.2.5/src/cpu/cpu_x86.c
@@ -1479,6 +1479,43 @@ x86GuestData(virCPUDefPtr host,
 }
 
 
+/*
+ * Checks whether cpuCandidate is a better fit for the CPU data than the
+ * currently selected one from cpuCurrent.
+ *
+ * Returns 0 if cpuCurrent is better,
+ *         1 if cpuCandidate is better,
+ *         2 if cpuCandidate is the best one (search should stop now).
+ */
+static int
+x86DecodeUseCandidate(virCPUDefPtr cpuCurrent,
+                      virCPUDefPtr cpuCandidate,
+                      const char *preferred,
+                      bool checkPolicy)
+{
+    if (checkPolicy) {
+        size_t i;
+        for (i = 0; i < cpuCandidate->nfeatures; i++) {
+            if (cpuCandidate->features[i].policy == VIR_CPU_FEATURE_DISABLE)
+                return 0;
+            cpuCandidate->features[i].policy = -1;
+        }
+    }
+
+    if (preferred &&
+        STREQ(cpuCandidate->model, preferred))
+        return 2;
+
+    if (!cpuCurrent)
+        return 1;
+
+    if (cpuCurrent->nfeatures > cpuCandidate->nfeatures)
+        return 1;
+
+    return 0;
+}
+
+
 static int
 x86Decode(virCPUDefPtr cpu,
           const virCPUx86Data *data,
@@ -1496,6 +1533,7 @@ x86Decode(virCPUDefPtr cpu,
     virCPUx86Data *features = NULL;
     const virCPUx86Data *cpuData = NULL;
     size_t i;
+    int rc;
 
     virCheckFlags(VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES, -1);
 
@@ -1525,6 +1563,7 @@ x86Decode(virCPUDefPtr cpu,
 
         if (!(cpuCandidate = x86DataToCPU(data, candidate, map)))
             goto out;
+        cpuCandidate->type = cpu->type;
 
         if (candidate->vendor && cpuCandidate->vendor &&
             STRNEQ(candidate->vendor->name, cpuCandidate->vendor)) {
@@ -1535,31 +1574,13 @@ x86Decode(virCPUDefPtr cpu,
             goto next;
         }
 
-        if (cpu->type == VIR_CPU_TYPE_HOST) {
-            cpuCandidate->type = VIR_CPU_TYPE_HOST;
-            for (i = 0; i < cpuCandidate->nfeatures; i++) {
-                switch (cpuCandidate->features[i].policy) {
-                case VIR_CPU_FEATURE_DISABLE:
-                    virCPUDefFree(cpuCandidate);
-                    goto next;
-                default:
-                    cpuCandidate->features[i].policy = -1;
-                }
-            }
-        }
-
-        if (preferred && STREQ(cpuCandidate->model, preferred)) {
-            virCPUDefFree(cpuModel);
-            cpuModel = cpuCandidate;
-            cpuData = candidate->data;
-            break;
-        }
-
-        if (cpuModel == NULL
-            || cpuModel->nfeatures > cpuCandidate->nfeatures) {
+        if ((rc = x86DecodeUseCandidate(cpuModel, cpuCandidate, preferred,
+                                        cpu->type == VIR_CPU_TYPE_HOST))) {
             virCPUDefFree(cpuModel);
             cpuModel = cpuCandidate;
             cpuData = candidate->data;
+            if (rc == 2)
+                break;
         } else {
             virCPUDefFree(cpuCandidate);
         }