mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
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:
parent
53c4f9fa1c
commit
b9a2552d2a
@ -127,11 +127,13 @@ int
|
|||||||
cpuDecode(virCPUDefPtr cpu,
|
cpuDecode(virCPUDefPtr cpu,
|
||||||
const union cpuData *data,
|
const union cpuData *data,
|
||||||
const char **models,
|
const char **models,
|
||||||
unsigned int nmodels)
|
unsigned int nmodels,
|
||||||
|
const char *preferred)
|
||||||
{
|
{
|
||||||
struct cpuArchDriver *driver;
|
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) {
|
if (models) {
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
for (i = 0; i < nmodels; i++)
|
for (i = 0; i < nmodels; i++)
|
||||||
@ -160,7 +162,7 @@ cpuDecode(virCPUDefPtr cpu,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return driver->decode(cpu, data, models, nmodels);
|
return driver->decode(cpu, data, models, nmodels, preferred);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -49,7 +49,8 @@ typedef int
|
|||||||
(*cpuArchDecode) (virCPUDefPtr cpu,
|
(*cpuArchDecode) (virCPUDefPtr cpu,
|
||||||
const union cpuData *data,
|
const union cpuData *data,
|
||||||
const char **models,
|
const char **models,
|
||||||
unsigned int nmodels);
|
unsigned int nmodels,
|
||||||
|
const char *preferred);
|
||||||
|
|
||||||
typedef int
|
typedef int
|
||||||
(*cpuArchEncode) (const virCPUDefPtr cpu,
|
(*cpuArchEncode) (const virCPUDefPtr cpu,
|
||||||
@ -108,7 +109,8 @@ extern int
|
|||||||
cpuDecode (virCPUDefPtr cpu,
|
cpuDecode (virCPUDefPtr cpu,
|
||||||
const union cpuData *data,
|
const union cpuData *data,
|
||||||
const char **models,
|
const char **models,
|
||||||
unsigned int nmodels);
|
unsigned int nmodels,
|
||||||
|
const char *preferred);
|
||||||
|
|
||||||
extern int
|
extern int
|
||||||
cpuEncode (const char *arch,
|
cpuEncode (const char *arch,
|
||||||
|
@ -1064,7 +1064,8 @@ static int
|
|||||||
x86Decode(virCPUDefPtr cpu,
|
x86Decode(virCPUDefPtr cpu,
|
||||||
const union cpuData *data,
|
const union cpuData *data,
|
||||||
const char **models,
|
const char **models,
|
||||||
unsigned int nmodels)
|
unsigned int nmodels,
|
||||||
|
const char *preferred)
|
||||||
{
|
{
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
struct x86_map *map;
|
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
|
if (cpuModel == NULL
|
||||||
|| cpuModel->nfeatures > cpuCandidate->nfeatures) {
|
|| cpuModel->nfeatures > cpuCandidate->nfeatures) {
|
||||||
virCPUDefFree(cpuModel);
|
virCPUDefFree(cpuModel);
|
||||||
@ -1356,7 +1363,7 @@ x86Baseline(virCPUDefPtr *cpus,
|
|||||||
if (!(data = x86DataFromModel(base_model)))
|
if (!(data = x86DataFromModel(base_model)))
|
||||||
goto no_memory;
|
goto no_memory;
|
||||||
|
|
||||||
if (x86Decode(cpu, data, models, nmodels) < 0)
|
if (x86Decode(cpu, data, models, nmodels, NULL) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
@ -1029,7 +1029,7 @@ qemudCapsInitCPU(virCapsPtr caps,
|
|||||||
cpu->threads = nodeinfo.threads;
|
cpu->threads = nodeinfo.threads;
|
||||||
|
|
||||||
if (!(data = cpuNodeData(arch))
|
if (!(data = cpuNodeData(arch))
|
||||||
|| cpuDecode(cpu, data, NULL, 0) < 0)
|
|| cpuDecode(cpu, data, NULL, 0, NULL) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
caps->host.cpu = cpu;
|
caps->host.cpu = cpu;
|
||||||
@ -3292,6 +3292,7 @@ qemuBuildCpuArgStr(const struct qemud_driver *driver,
|
|||||||
|
|
||||||
if (ncpus > 0 && host) {
|
if (ncpus > 0 && host) {
|
||||||
virCPUCompareResult cmp;
|
virCPUCompareResult cmp;
|
||||||
|
const char *preferred;
|
||||||
|
|
||||||
cmp = cpuGuestData(host, def->cpu, &data);
|
cmp = cpuGuestData(host, def->cpu, &data);
|
||||||
switch (cmp) {
|
switch (cmp) {
|
||||||
@ -3309,8 +3310,13 @@ qemuBuildCpuArgStr(const struct qemud_driver *driver,
|
|||||||
if (VIR_ALLOC(guest) < 0 || !(guest->arch = strdup(ut->machine)))
|
if (VIR_ALLOC(guest) < 0 || !(guest->arch = strdup(ut->machine)))
|
||||||
goto no_memory;
|
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;
|
guest->type = VIR_CPU_TYPE_GUEST;
|
||||||
if (cpuDecode(guest, data, cpus, ncpus) < 0)
|
if (cpuDecode(guest, data, cpus, ncpus, preferred) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
virBufferVSprintf(&buf, "%s", guest->model);
|
virBufferVSprintf(&buf, "%s", guest->model);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user