]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
cpu_x86: Refactor virCPUx86CompareCandidateFeatureList
authorJiri Denemark <jdenemar@redhat.com>
Wed, 16 Apr 2025 12:30:12 +0000 (14:30 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Mon, 5 May 2025 09:03:57 +0000 (11:03 +0200)
Refactor weight calculation to a separate virCPUx86WeightFeatures
function to avoid code duplication. The algorithm is not changed during
the refactoring, it will be fixed later.

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
src/cpu/cpu_x86.c

index 32aa01bc142c0638516a903647385fcf9d40aff0..b0fe2bed4c5580150603682a7413ed37ea6d6e81 100644 (file)
@@ -2090,63 +2090,72 @@ virCPUx86Compare(virCPUDef *host,
 /* Base penalty for disabled features. */
 #define BASE_PENALTY 2
 
+struct virCPUx86Weight {
+    size_t total;
+    size_t enabled;
+    size_t disabled;
+};
+
+static void
+virCPUx86WeightFeatures(const virCPUDef *cpu,
+                        struct virCPUx86Weight *weight)
+{
+    int penalty = BASE_PENALTY;
+    size_t i;
+
+    weight->enabled = cpu->nfeatures;
+    weight->disabled = 0;
+
+    if (cpu->type == VIR_CPU_TYPE_HOST) {
+        weight->total = cpu->nfeatures;
+        return;
+    }
+
+    for (i = 0; i < weight->enabled; i++) {
+        if (cpu->features[i].policy == VIR_CPU_FEATURE_DISABLE) {
+            weight->enabled--;
+            weight->disabled += penalty;
+            penalty++;
+        }
+    }
+
+    weight->total = weight->enabled + weight->disabled;
+}
+
+
 static int
 virCPUx86CompareCandidateFeatureList(virCPUDef *cpuCurrent,
                                      virCPUDef *cpuCandidate,
                                      bool isPreferred)
 {
-    size_t current = cpuCurrent->nfeatures;
-    size_t enabledCurrent = current;
-    size_t disabledCurrent = 0;
-    size_t candidate = cpuCandidate->nfeatures;
-    size_t enabled = candidate;
-    size_t disabled = 0;
-
-    if (cpuCandidate->type != VIR_CPU_TYPE_HOST) {
-        size_t i;
-        int penalty = BASE_PENALTY;
+    struct virCPUx86Weight current = { 0 };
+    struct virCPUx86Weight candidate = { 0 };
 
-        for (i = 0; i < enabledCurrent; i++) {
-            if (cpuCurrent->features[i].policy == VIR_CPU_FEATURE_DISABLE) {
-                enabledCurrent--;
-                disabledCurrent += penalty;
-                penalty++;
-            }
-        }
-        current = enabledCurrent + disabledCurrent;
-
-        penalty = BASE_PENALTY;
-        for (i = 0; i < enabled; i++) {
-            if (cpuCandidate->features[i].policy == VIR_CPU_FEATURE_DISABLE) {
-                enabled--;
-                disabled += penalty;
-                penalty++;
-            }
-        }
-        candidate = enabled + disabled;
-    }
+    virCPUx86WeightFeatures(cpuCurrent, &current);
+    virCPUx86WeightFeatures(cpuCandidate, &candidate);
 
-    if (candidate < current ||
-        (candidate == current && disabled < disabledCurrent)) {
+    if (candidate.total < current.total ||
+        (candidate.total == current.total &&
+         candidate.disabled < current.disabled)) {
         VIR_DEBUG("%s is better than %s: %zu (%zu, %zu) < %zu (%zu, %zu)",
                   cpuCandidate->model, cpuCurrent->model,
-                  candidate, enabled, disabled,
-                  current, enabledCurrent, disabledCurrent);
+                  candidate.total, candidate.enabled, candidate.disabled,
+                  current.total, current.enabled, current.disabled);
         return 1;
     }
 
-    if (isPreferred && disabled < disabledCurrent) {
+    if (isPreferred && candidate.disabled < current.disabled) {
         VIR_DEBUG("%s is in the list of preferred models and provides fewer "
                   "disabled features than %s: %zu < %zu",
                   cpuCandidate->model, cpuCurrent->model,
-                  disabled, disabledCurrent);
+                  candidate.disabled, current.disabled);
         return 1;
     }
 
     VIR_DEBUG("%s is not better than %s: %zu (%zu, %zu) >= %zu (%zu, %zu)",
               cpuCandidate->model, cpuCurrent->model,
-              candidate, enabled, disabled,
-              current, enabledCurrent, disabledCurrent);
+              candidate.total, candidate.enabled, candidate.disabled,
+              current.total, current.enabled, current.disabled);
     return 0;
 }