From: Jiri Denemark Date: Wed, 16 Apr 2025 12:30:12 +0000 (+0200) Subject: cpu_x86: Refactor virCPUx86CompareCandidateFeatureList X-Git-Tag: v11.4.0-rc1~95 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8c23ba74c76fcfb9e1243dc8ec5cfbf93890e96d;p=thirdparty%2Flibvirt.git cpu_x86: Refactor virCPUx86CompareCandidateFeatureList 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 Reviewed-by: Peter Krempa --- diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c index 32aa01bc14..b0fe2bed4c 100644 --- a/src/cpu/cpu_x86.c +++ b/src/cpu/cpu_x86.c @@ -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, ¤t); + 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; }