cpu: Introduce virCPUUpdateFeatures

This new API can be used to update an existing CPU definition with
features described by CPU data.

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
This commit is contained in:
Jiri Denemark committed 2026-06-02 13:45:26 +02:00
1 parent a8952076d8
commit 6be1be4938
4 files changed
+70

No files matched your search

+34
View File
@@ -1359,6 +1359,40 @@ virCPUGetCanonicalModel(virArch arch,
}
/** virCPUUpdateFeatures:
*
* @arch: CPU architecture
* @cpu: CPU definition to update
* @cpuData: CPU data describing features
* @policy: to be used by the updated features
*
* Updates features described in @cpuData to use the specified @policy. Missing
* features will be automatically added to the CPU definition.
*
* Returns 0 on success, -1 otherwise.
*/
int
virCPUUpdateFeatures(virArch arch,
virCPUDef *cpu,
virCPUData *cpuData,
virCPUFeaturePolicy policy)
{
struct cpuArchDriver *driver;
VIR_DEBUG("arch=%s, cpu=%p, model=%s, policy=%s",
virArchToString(arch), cpu, NULLSTR(cpu->model),
virCPUFeaturePolicyTypeToString(policy));
if (!(driver = cpuGetSubDriver(arch)))
return -1;
if (!driver->updateFeatures)
return 0;
return driver->updateFeatures(cpu, cpuData, policy);
}
/**
* virCPUArchIsSupported:
*
+12
View File
@@ -143,6 +143,11 @@ typedef int
typedef const char *
(*virCPUArchGetCanonicalModel)(const char *model);
typedef int
(*virCPUArchUpdateFeatures)(virCPUDef *cpu,
virCPUData *cpuData,
virCPUFeaturePolicy policy);
struct cpuArchDriver {
const char *name;
const virArch *arch;
@@ -172,6 +177,7 @@ struct cpuArchDriver {
virCPUArchDataGetHost dataGetHost;
virCPUArchGetCheckMode getCheckMode;
virCPUArchGetCanonicalModel getCanonicalModel;
virCPUArchUpdateFeatures updateFeatures;
};
@@ -332,6 +338,12 @@ const char *
virCPUGetCanonicalModel(virArch arch,
const char *model);
int
virCPUUpdateFeatures(virArch arch,
virCPUDef *cpu,
virCPUData *cpuData,
virCPUFeaturePolicy policy);
bool
virCPUArchIsSupported(virArch arch);
+23
View File
@@ -3789,6 +3789,28 @@ virCPUx86GetCanonicalModel(const char *modelName)
}
static int
virCPUx86UpdateFeatures(virCPUDef *cpu,
virCPUData *cpuData,
virCPUFeaturePolicy policy)
{
virCPUx86Data *data = &cpuData->data.x86;
virCPUx86Map *map;
size_t i;
if (!(map = virCPUx86GetMap()))
return -1;
for (i = 0; i < map->nfeatures; i++) {
virCPUx86Feature *feature = map->features[i];
if (x86DataIsSubset(data, &feature->data))
virCPUDefUpdateFeature(cpu, feature->name, policy);
}
return 0;
}
struct cpuArchDriver cpuDriverX86 = {
.name = "x86",
.arch = archs,
@@ -3823,4 +3845,5 @@ struct cpuArchDriver cpuDriverX86 = {
#endif
.getCheckMode = virCPUx86GetCheckMode,
.getCanonicalModel = virCPUx86GetCanonicalModel,
.updateFeatures = virCPUx86UpdateFeatures,
};
+1
View File
@@ -1593,6 +1593,7 @@ virCPUGetVendorForModel;
virCPUProbeHost;
virCPUTranslate;
virCPUUpdate;
virCPUUpdateFeatures;
virCPUUpdateLive;
virCPUValidateFeatures;