qemu: Ask QEMU for filtered CPU features

qemuMonitorGetGuestCPU can now optionally create CPU data from
filtered-features in addition to feature-words.

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
This commit is contained in:
Jiri Denemark 2017-03-13 11:00:48 +01:00
parent 253db85e2d
commit 77c9c4f127
6 changed files with 38 additions and 10 deletions

View File

@ -4026,6 +4026,7 @@ qemuMonitorSetDomainLog(qemuMonitorPtr mon,
* @mon: Pointer to the monitor * @mon: Pointer to the monitor
* @arch: arch of the guest * @arch: arch of the guest
* @data: returns the cpu data * @data: returns the cpu data
* @disabled: returns the CPU data for features which were disabled by QEMU
* *
* Retrieve the definition of the guest CPU from a running qemu instance. * Retrieve the definition of the guest CPU from a running qemu instance.
* *
@ -4035,15 +4036,19 @@ qemuMonitorSetDomainLog(qemuMonitorPtr mon,
int int
qemuMonitorGetGuestCPU(qemuMonitorPtr mon, qemuMonitorGetGuestCPU(qemuMonitorPtr mon,
virArch arch, virArch arch,
virCPUDataPtr *data) virCPUDataPtr *data,
virCPUDataPtr *disabled)
{ {
VIR_DEBUG("arch='%s' data='%p'", virArchToString(arch), data); VIR_DEBUG("arch=%s data=%p disabled=%p",
virArchToString(arch), data, disabled);
QEMU_CHECK_MONITOR_JSON(mon); QEMU_CHECK_MONITOR_JSON(mon);
*data = NULL; *data = NULL;
if (disabled)
*disabled = NULL;
return qemuMonitorJSONGetGuestCPU(mon, arch, data); return qemuMonitorJSONGetGuestCPU(mon, arch, data, disabled);
} }

View File

@ -1021,7 +1021,8 @@ void qemuMonitorSetDomainLog(qemuMonitorPtr mon,
int qemuMonitorGetGuestCPU(qemuMonitorPtr mon, int qemuMonitorGetGuestCPU(qemuMonitorPtr mon,
virArch arch, virArch arch,
virCPUDataPtr *data); virCPUDataPtr *data,
virCPUDataPtr *disabled);
int qemuMonitorRTCResetReinjection(qemuMonitorPtr mon); int qemuMonitorRTCResetReinjection(qemuMonitorPtr mon);

View File

@ -6728,6 +6728,7 @@ qemuMonitorJSONCheckCPUx86(qemuMonitorPtr mon)
* @mon: Pointer to the monitor * @mon: Pointer to the monitor
* @arch: arch of the guest * @arch: arch of the guest
* @data: returns the cpu data of the guest * @data: returns the cpu data of the guest
* @disabled: returns the CPU data for features which were disabled by QEMU
* *
* Retrieve the definition of the guest CPU from a running qemu instance. * Retrieve the definition of the guest CPU from a running qemu instance.
* *
@ -6737,8 +6738,11 @@ qemuMonitorJSONCheckCPUx86(qemuMonitorPtr mon)
int int
qemuMonitorJSONGetGuestCPU(qemuMonitorPtr mon, qemuMonitorJSONGetGuestCPU(qemuMonitorPtr mon,
virArch arch, virArch arch,
virCPUDataPtr *data) virCPUDataPtr *data,
virCPUDataPtr *disabled)
{ {
virCPUDataPtr cpuEnabled = NULL;
virCPUDataPtr cpuDisabled = NULL;
int rc; int rc;
if (ARCH_IS_X86(arch)) { if (ARCH_IS_X86(arch)) {
@ -6747,13 +6751,30 @@ qemuMonitorJSONGetGuestCPU(qemuMonitorPtr mon,
else if (!rc) else if (!rc)
return -2; return -2;
return qemuMonitorJSONGetCPUx86Data(mon, "feature-words", data); if (qemuMonitorJSONGetCPUx86Data(mon, "feature-words",
&cpuEnabled) < 0)
goto error;
if (disabled &&
qemuMonitorJSONGetCPUx86Data(mon, "filtered-features",
&cpuDisabled) < 0)
goto error;
*data = cpuEnabled;
if (disabled)
*disabled = cpuDisabled;
return 0;
} }
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
_("CPU definition retrieval isn't supported for '%s'"), _("CPU definition retrieval isn't supported for '%s'"),
virArchToString(arch)); virArchToString(arch));
return -1; return -1;
error:
virCPUDataFree(cpuEnabled);
virCPUDataFree(cpuDisabled);
return -1;
} }
int int

View File

@ -475,7 +475,8 @@ int qemuMonitorJSONGetCPUx86Data(qemuMonitorPtr mon,
int qemuMonitorJSONGetGuestCPU(qemuMonitorPtr mon, int qemuMonitorJSONGetGuestCPU(qemuMonitorPtr mon,
virArch arch, virArch arch,
virCPUDataPtr *data); virCPUDataPtr *data,
virCPUDataPtr *disabled);
int qemuMonitorJSONRTCResetReinjection(qemuMonitorPtr mon); int qemuMonitorJSONRTCResetReinjection(qemuMonitorPtr mon);

View File

@ -3854,7 +3854,7 @@ qemuProcessVerifyGuestCPU(virQEMUDriverPtr driver,
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0) if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
goto cleanup; goto cleanup;
rc = qemuMonitorGetGuestCPU(priv->mon, def->os.arch, &cpu); rc = qemuMonitorGetGuestCPU(priv->mon, def->os.arch, &cpu, NULL);
if (qemuDomainObjExitMonitor(driver, vm) < 0) if (qemuDomainObjExitMonitor(driver, vm) < 0)
goto cleanup; goto cleanup;

View File

@ -2395,7 +2395,7 @@ testQemuMonitorJSONGetCPUData(const void *opaque)
if (qemuMonitorJSONGetGuestCPU(qemuMonitorTestGetMonitor(test), if (qemuMonitorJSONGetGuestCPU(qemuMonitorTestGetMonitor(test),
VIR_ARCH_X86_64, VIR_ARCH_X86_64,
&cpuData) < 0) &cpuData, NULL) < 0)
goto cleanup; goto cleanup;
if (!(actual = virCPUDataFormat(cpuData))) if (!(actual = virCPUDataFormat(cpuData)))
@ -2438,7 +2438,7 @@ testQemuMonitorJSONGetNonExistingCPUData(const void *opaque)
rv = qemuMonitorJSONGetGuestCPU(qemuMonitorTestGetMonitor(test), rv = qemuMonitorJSONGetGuestCPU(qemuMonitorTestGetMonitor(test),
VIR_ARCH_X86_64, VIR_ARCH_X86_64,
&cpuData); &cpuData, NULL);
if (rv != -2) { if (rv != -2) {
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
"Unexpected return value %d, expecting -2", rv); "Unexpected return value %d, expecting -2", rv);