mirror of
https://github.com/libvirt/libvirt.git
synced 2026-10-02 12:20:06 -05:00
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:
1 parent
a8952076d8
commit
6be1be4938
4 files changed
+70
No files matched your search
@@ -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:
|
||||
*
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
@@ -1593,6 +1593,7 @@ virCPUGetVendorForModel;
|
||||
virCPUProbeHost;
|
||||
virCPUTranslate;
|
||||
virCPUUpdate;
|
||||
virCPUUpdateFeatures;
|
||||
virCPUUpdateLive;
|
||||
virCPUValidateFeatures;
|
||||
|
||||
|
||||
Reference in new issue
Block a user