render / rpms / libvirt

Forked from rpms/libvirt 5 months ago
Clone
bcddb9
From 892d1dd5115d91c9ca527a5be954087f390b6159 Mon Sep 17 00:00:00 2001
bcddb9
Message-Id: <892d1dd5115d91c9ca527a5be954087f390b6159@dist-git>
bcddb9
From: Jiri Denemark <jdenemar@redhat.com>
bcddb9
Date: Mon, 4 Mar 2019 16:36:33 +0100
bcddb9
Subject: [PATCH] cpu_x86: Store CPU signature in an array
bcddb9
MIME-Version: 1.0
bcddb9
Content-Type: text/plain; charset=UTF-8
bcddb9
Content-Transfer-Encoding: 8bit
bcddb9
bcddb9
In preparation for storing several CPU signatures in a single CPU model,
bcddb9
we need to turn virCPUx86Model's signature into an array of signatures.
bcddb9
bcddb9
The parser still hardcodes the number of signatures to 1, but the
bcddb9
following patch will drop this limit.
bcddb9
bcddb9
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
bcddb9
Reviewed-by: Ján Tomko <jtomko@redhat.com>
bcddb9
(cherry picked from commit b07b8b7750c6a505d4b00bd272e79ea0305cb610)
bcddb9
bcddb9
https://bugzilla.redhat.com/show_bug.cgi?id=1558558
bcddb9
https://bugzilla.redhat.com/show_bug.cgi?id=1687515
bcddb9
bcddb9
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
bcddb9
Reviewed-by: Ján Tomko <jtomko@redhat.com>
bcddb9
---
bcddb9
 src/cpu/cpu_x86.c | 50 ++++++++++++++++++++++++++++++++++++++---------
bcddb9
 1 file changed, 41 insertions(+), 9 deletions(-)
bcddb9
bcddb9
diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c
bcddb9
index e54a3986a1..543533148f 100644
bcddb9
--- a/src/cpu/cpu_x86.c
bcddb9
+++ b/src/cpu/cpu_x86.c
bcddb9
@@ -136,7 +136,8 @@ typedef virCPUx86Model *virCPUx86ModelPtr;
bcddb9
 struct _virCPUx86Model {
bcddb9
     char *name;
bcddb9
     virCPUx86VendorPtr vendor;
bcddb9
-    uint32_t signature;
bcddb9
+    size_t nsignatures;
bcddb9
+    uint32_t *signatures;
bcddb9
     virCPUx86Data data;
bcddb9
 };
bcddb9
 
bcddb9
@@ -1008,6 +1009,7 @@ x86ModelFree(virCPUx86ModelPtr model)
bcddb9
         return;
bcddb9
 
bcddb9
     VIR_FREE(model->name);
bcddb9
+    VIR_FREE(model->signatures);
bcddb9
     virCPUx86DataClear(&model->data);
bcddb9
     VIR_FREE(model);
bcddb9
 }
bcddb9
@@ -1017,7 +1019,14 @@ static int
bcddb9
 x86ModelCopySignatures(virCPUx86ModelPtr dst,
bcddb9
                        virCPUx86ModelPtr src)
bcddb9
 {
bcddb9
-    dst->signature = src->signature;
bcddb9
+    size_t i;
bcddb9
+
bcddb9
+    if (VIR_ALLOC_N(dst->signatures, src->nsignatures) < 0)
bcddb9
+        return -1;
bcddb9
+
bcddb9
+    dst->nsignatures = src->nsignatures;
bcddb9
+    for (i = 0; i < src->nsignatures; i++)
bcddb9
+        dst->signatures[i] = src->signatures[i];
bcddb9
 
bcddb9
     return 0;
bcddb9
 }
bcddb9
@@ -1198,12 +1207,18 @@ static int
bcddb9
 x86ModelParseSignature(virCPUx86ModelPtr model,
bcddb9
                        xmlXPathContextPtr ctxt)
bcddb9
 {
bcddb9
+    /* Remove inherited signatures. */
bcddb9
+    VIR_FREE(model->signatures);
bcddb9
 
bcddb9
     if (virXPathBoolean("boolean(./signature)", ctxt)) {
bcddb9
         unsigned int sigFamily = 0;
bcddb9
         unsigned int sigModel = 0;
bcddb9
         int rc;
bcddb9
 
bcddb9
+        model->nsignatures = 1;
bcddb9
+        if (VIR_ALLOC_N(model->signatures, 1) < 0)
bcddb9
+            return -1;
bcddb9
+
bcddb9
         rc = virXPathUInt("string(./signature/@family)", ctxt, &sigFamily);
bcddb9
         if (rc < 0 || sigFamily == 0) {
bcddb9
             virReportError(VIR_ERR_INTERNAL_ERROR,
bcddb9
@@ -1220,7 +1235,7 @@ x86ModelParseSignature(virCPUx86ModelPtr model,
bcddb9
             return -1;
bcddb9
         }
bcddb9
 
bcddb9
-        model->signature = x86MakeSignature(sigFamily, sigModel, 0);
bcddb9
+        model->signatures[0] = x86MakeSignature(sigFamily, sigModel, 0);
bcddb9
     }
bcddb9
 
bcddb9
     return 0;
bcddb9
@@ -1665,7 +1680,8 @@ x86Compute(virCPUDefPtr host,
bcddb9
                                      &host_model->vendor->cpuid) < 0)
bcddb9
             goto error;
bcddb9
 
bcddb9
-        if (x86DataAddSignature(&guest_model->data, host_model->signature) < 0)
bcddb9
+        if (host_model->signatures &&
bcddb9
+            x86DataAddSignature(&guest_model->data, *host_model->signatures) < 0)
bcddb9
             goto error;
bcddb9
 
bcddb9
         if (cpu->type == VIR_CPU_TYPE_GUEST
bcddb9
@@ -1771,6 +1787,21 @@ virCPUx86Compare(virCPUDefPtr host,
bcddb9
 }
bcddb9
 
bcddb9
 
bcddb9
+static bool
bcddb9
+x86ModelHasSignature(virCPUx86ModelPtr model,
bcddb9
+                     uint32_t signature)
bcddb9
+{
bcddb9
+    size_t i;
bcddb9
+
bcddb9
+    for (i = 0; i < model->nsignatures; i++) {
bcddb9
+        if (model->signatures[i] == signature)
bcddb9
+            return true;
bcddb9
+    }
bcddb9
+
bcddb9
+    return false;
bcddb9
+}
bcddb9
+
bcddb9
+
bcddb9
 /*
bcddb9
  * Checks whether a candidate model is a better fit for the CPU data than the
bcddb9
  * current model.
bcddb9
@@ -1812,8 +1843,8 @@ x86DecodeUseCandidate(virCPUx86ModelPtr current,
bcddb9
      * consider candidates with matching family/model.
bcddb9
      */
bcddb9
     if (signature &&
bcddb9
-        current->signature == signature &&
bcddb9
-        candidate->signature != signature) {
bcddb9
+        x86ModelHasSignature(current, signature) &&
bcddb9
+        !x86ModelHasSignature(candidate, signature)) {
bcddb9
         VIR_DEBUG("%s differs in signature from matching %s",
bcddb9
                   cpuCandidate->model, cpuCurrent->model);
bcddb9
         return 0;
bcddb9
@@ -1829,8 +1860,8 @@ x86DecodeUseCandidate(virCPUx86ModelPtr current,
bcddb9
      * result in longer list of features.
bcddb9
      */
bcddb9
     if (signature &&
bcddb9
-        candidate->signature == signature &&
bcddb9
-        current->signature != signature) {
bcddb9
+        x86ModelHasSignature(candidate, signature) &&
bcddb9
+        !x86ModelHasSignature(current, signature)) {
bcddb9
         VIR_DEBUG("%s provides matching signature", cpuCandidate->model);
bcddb9
         return 1;
bcddb9
     }
bcddb9
@@ -2898,7 +2929,8 @@ virCPUx86Translate(virCPUDefPtr cpu,
bcddb9
         virCPUx86DataAddCPUIDInt(&model->data, &model->vendor->cpuid) < 0)
bcddb9
         goto cleanup;
bcddb9
 
bcddb9
-    if (x86DataAddSignature(&model->data, model->signature) < 0)
bcddb9
+    if (model->signatures &&
bcddb9
+        x86DataAddSignature(&model->data, model->signatures[0]) < 0)
bcddb9
         goto cleanup;
bcddb9
 
bcddb9
     if (!(translated = virCPUDefCopyWithoutModel(cpu)))
bcddb9
-- 
bcddb9
2.21.0
bcddb9