Use configured CPU model if possible

Adds ability to provide a preferred CPU model for CPUID data decoding.
Such model would be considered as the best possible model (if it's
supported by hypervisor) regardless on number of features which have to
be added or removed for describing required CPU.
This commit is contained in:
Jiri Denemark 2010-04-15 12:06:13 +02:00
parent 53c4f9fa1c
commit b9a2552d2a
4 changed files with 26 additions and 9 deletions

View File

@ -127,11 +127,13 @@ int
cpuDecode(virCPUDefPtr cpu,
const union cpuData *data,
const char **models,
unsigned int nmodels)
unsigned int nmodels,
const char *preferred)
{
struct cpuArchDriver *driver;
VIR_DEBUG("cpu=%p, data=%p, nmodels=%u", cpu, data, nmodels);
VIR_DEBUG("cpu=%p, data=%p, nmodels=%u, preferred=%s",
cpu, data, nmodels, NULLSTR(preferred));
if (models) {
unsigned int i;
for (i = 0; i < nmodels; i++)
@ -160,7 +162,7 @@ cpuDecode(virCPUDefPtr cpu,
return -1;
}
return driver->decode(cpu, data, models, nmodels);
return driver->decode(cpu, data, models, nmodels, preferred);
}

View File

@ -49,7 +49,8 @@ typedef int
(*cpuArchDecode) (virCPUDefPtr cpu,
const union cpuData *data,
const char **models,
unsigned int nmodels);
unsigned int nmodels,
const char *preferred);
typedef int
(*cpuArchEncode) (const virCPUDefPtr cpu,
@ -108,7 +109,8 @@ extern int
cpuDecode (virCPUDefPtr cpu,
const union cpuData *data,
const char **models,
unsigned int nmodels);
unsigned int nmodels,
const char *preferred);
extern int
cpuEncode (const char *arch,

View File

@ -1064,7 +1064,8 @@ static int
x86Decode(virCPUDefPtr cpu,
const union cpuData *data,
const char **models,
unsigned int nmodels)
unsigned int nmodels,
const char *preferred)
{
int ret = -1;
struct x86_map *map;
@ -1109,6 +1110,12 @@ x86Decode(virCPUDefPtr cpu,
}
}
if (preferred && STREQ(cpuCandidate->model, preferred)) {
virCPUDefFree(cpuModel);
cpuModel = cpuCandidate;
break;
}
if (cpuModel == NULL
|| cpuModel->nfeatures > cpuCandidate->nfeatures) {
virCPUDefFree(cpuModel);
@ -1356,7 +1363,7 @@ x86Baseline(virCPUDefPtr *cpus,
if (!(data = x86DataFromModel(base_model)))
goto no_memory;
if (x86Decode(cpu, data, models, nmodels) < 0)
if (x86Decode(cpu, data, models, nmodels, NULL) < 0)
goto error;
cleanup:

View File

@ -1029,7 +1029,7 @@ qemudCapsInitCPU(virCapsPtr caps,
cpu->threads = nodeinfo.threads;
if (!(data = cpuNodeData(arch))
|| cpuDecode(cpu, data, NULL, 0) < 0)
|| cpuDecode(cpu, data, NULL, 0, NULL) < 0)
goto error;
caps->host.cpu = cpu;
@ -3292,6 +3292,7 @@ qemuBuildCpuArgStr(const struct qemud_driver *driver,
if (ncpus > 0 && host) {
virCPUCompareResult cmp;
const char *preferred;
cmp = cpuGuestData(host, def->cpu, &data);
switch (cmp) {
@ -3309,8 +3310,13 @@ qemuBuildCpuArgStr(const struct qemud_driver *driver,
if (VIR_ALLOC(guest) < 0 || !(guest->arch = strdup(ut->machine)))
goto no_memory;
if (def->cpu->match == VIR_CPU_MATCH_MINIMUM)
preferred = host->model;
else
preferred = def->cpu->model;
guest->type = VIR_CPU_TYPE_GUEST;
if (cpuDecode(guest, data, cpus, ncpus) < 0)
if (cpuDecode(guest, data, cpus, ncpus, preferred) < 0)
goto cleanup;
virBufferVSprintf(&buf, "%s", guest->model);