提交 adf009b4 编写于 作者: D Daniel P. Berrangé

qemu: use host CPU object directly

Avoid grabbing the whole virCapsPtr object when we only need the
host CPU information.
Reviewed-by: NMichal Privoznik <mprivozn@redhat.com>
Signed-off-by: NDaniel P. Berrangé <berrange@redhat.com>
上级 8506afff
......@@ -1035,9 +1035,6 @@ virQEMUCapsInit(virFileCachePtr cache)
if (virCapabilitiesInitCaches(caps) < 0)
VIR_WARN("Failed to get host CPU cache info");
if (!(caps->host.cpu = virCPUProbeHost(caps->host.arch)))
VIR_WARN("Failed to get host CPU");
/* Add the power management features of the host */
if (virNodeSuspendGetTargetMask(&caps->host.powerMgmt) < 0)
VIR_WARN("Failed to get host power management capabilities");
......
......@@ -1220,6 +1220,22 @@ virQEMUDriverGetHostNUMACaps(virQEMUDriverPtr driver)
}
virCPUDefPtr
virQEMUDriverGetHostCPU(virQEMUDriverPtr driver)
{
qemuDriverLock(driver);
if (!driver->hostcpu)
driver->hostcpu = virCPUProbeHost(virArchFromHost());
qemuDriverUnlock(driver);
virCPUDefRef(driver->hostcpu);
return driver->hostcpu;
}
virCapsPtr virQEMUDriverCreateCapabilities(virQEMUDriverPtr driver)
{
size_t i, j;
......@@ -1272,6 +1288,7 @@ virCapsPtr virQEMUDriverCreateCapabilities(virQEMUDriverPtr driver)
}
caps->host.numa = virQEMUDriverGetHostNUMACaps(driver);
caps->host.cpu = virQEMUDriverGetHostCPU(driver);
return g_steal_pointer(&caps);
}
......
......@@ -267,6 +267,11 @@ struct _virQEMUDriver {
*/
virCapsHostNUMAPtr hostnuma;
/* Lazy initialized on first use, immutable thereafter.
* Require lock to get the pointer & do optional initialization
*/
virCPUDefPtr hostcpu;
/* Immutable value */
virArch hostarch;
......@@ -325,6 +330,7 @@ virQEMUDriverConfigPtr virQEMUDriverGetConfig(virQEMUDriverPtr driver);
bool virQEMUDriverIsPrivileged(virQEMUDriverPtr driver);
virCapsHostNUMAPtr virQEMUDriverGetHostNUMACaps(virQEMUDriverPtr driver);
virCPUDefPtr virQEMUDriverGetHostCPU(virQEMUDriverPtr driver);
virCapsPtr virQEMUDriverCreateCapabilities(virQEMUDriverPtr driver);
virCapsPtr virQEMUDriverGetCapabilities(virQEMUDriverPtr driver,
bool refresh);
......
......@@ -13360,7 +13360,7 @@ qemuConnectCompareCPU(virConnectPtr conn,
unsigned int flags)
{
virQEMUDriverPtr driver = conn->privateData;
g_autoptr(virCaps) caps = NULL;
g_autoptr(virCPUDef) cpu = NULL;
bool failIncompatible;
virCheckFlags(VIR_CONNECT_COMPARE_CPU_FAIL_INCOMPATIBLE,
......@@ -13371,10 +13371,10 @@ qemuConnectCompareCPU(virConnectPtr conn,
failIncompatible = !!(flags & VIR_CONNECT_COMPARE_CPU_FAIL_INCOMPATIBLE);
if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
if (!(cpu = virQEMUDriverGetHostCPU(driver)))
return VIR_CPU_COMPARE_ERROR;
return virCPUCompareXML(driver->hostarch, caps->host.cpu,
return virCPUCompareXML(driver->hostarch, cpu,
xmlDesc, failIncompatible);
}
......
......@@ -5291,12 +5291,13 @@ qemuProcessStartValidateDisks(virDomainObjPtr vm,
static int
qemuProcessStartValidateTSC(virDomainObjPtr vm,
virCapsPtr caps)
qemuProcessStartValidateTSC(virQEMUDriverPtr driver,
virDomainObjPtr vm)
{
size_t i;
unsigned long long freq = 0;
virHostCPUTscInfoPtr tsc;
g_autoptr(virCPUDef) cpu = NULL;
for (i = 0; i < vm->def->clock.ntimers; i++) {
virDomainTimerDefPtr timer = vm->def->clock.timers[i];
......@@ -5313,12 +5314,13 @@ qemuProcessStartValidateTSC(virDomainObjPtr vm,
VIR_DEBUG("Requested TSC frequency %llu Hz", freq);
if (!caps->host.cpu || !caps->host.cpu->tsc) {
cpu = virQEMUDriverGetHostCPU(driver);
if (!cpu || !cpu->tsc) {
VIR_DEBUG("Host TSC frequency could not be probed");
return 0;
}
tsc = caps->host.cpu->tsc;
tsc = cpu->tsc;
VIR_DEBUG("Host TSC frequency %llu Hz, scaling %s",
tsc->frequency, virTristateBoolTypeToString(tsc->scaling));
......@@ -5356,7 +5358,6 @@ static int
qemuProcessStartValidate(virQEMUDriverPtr driver,
virDomainObjPtr vm,
virQEMUCapsPtr qemuCaps,
virCapsPtr caps,
unsigned int flags)
{
if (!(flags & VIR_QEMU_PROCESS_START_PRETEND)) {
......@@ -5424,7 +5425,7 @@ qemuProcessStartValidate(virQEMUDriverPtr driver,
if (qemuProcessStartValidateDisks(vm, qemuCaps) < 0)
return -1;
if (qemuProcessStartValidateTSC(vm, caps) < 0)
if (qemuProcessStartValidateTSC(driver, vm) < 0)
return -1;
VIR_DEBUG("Checking for any possible (non-fatal) issues");
......@@ -5555,7 +5556,6 @@ qemuProcessInit(virQEMUDriverPtr driver,
bool migration,
unsigned int flags)
{
virCapsPtr caps = NULL;
qemuDomainObjPrivatePtr priv = vm->privateData;
int stopFlags;
virCPUDefPtr origCPU = NULL;
......@@ -5572,9 +5572,6 @@ qemuProcessInit(virQEMUDriverPtr driver,
goto cleanup;
}
if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
goto cleanup;
/* in case when the post parse callback failed we need to re-run it on the
* old config prior we start the VM */
if (vm->def->postParseFailed) {
......@@ -5592,7 +5589,7 @@ qemuProcessInit(virQEMUDriverPtr driver,
if (qemuDomainUpdateCPU(vm, updatedCPU, &origCPU) < 0)
goto cleanup;
if (qemuProcessStartValidate(driver, vm, priv->qemuCaps, caps, flags) < 0)
if (qemuProcessStartValidate(driver, vm, priv->qemuCaps, flags) < 0)
goto cleanup;
/* Do this upfront, so any part of the startup process can add
......@@ -5632,7 +5629,6 @@ qemuProcessInit(virQEMUDriverPtr driver,
cleanup:
virCPUDefFree(origCPU);
virObjectUnref(caps);
return ret;
stop:
......@@ -7805,20 +7801,20 @@ static int
qemuProcessRefreshCPU(virQEMUDriverPtr driver,
virDomainObjPtr vm)
{
virCapsPtr caps = virQEMUDriverGetCapabilities(driver, false);
qemuDomainObjPrivatePtr priv = vm->privateData;
virCPUDefPtr host = NULL;
virCPUDefPtr cpu = NULL;
int ret = -1;
g_autoptr(virCPUDef) host = NULL;
g_autoptr(virCPUDef) hostmig = NULL;
g_autoptr(virCPUDef) cpu = NULL;
if (!caps)
return -1;
if (!virQEMUCapsGuestIsNative(driver->hostarch, vm->def->os.arch))
return 0;
if (!virQEMUCapsGuestIsNative(driver->hostarch, vm->def->os.arch) ||
!caps->host.cpu ||
!vm->def->cpu) {
ret = 0;
goto cleanup;
if (!vm->def->cpu)
return 0;
if (!(host = virQEMUDriverGetHostCPU(driver))) {
virResetLastError();
return 0;
}
/* If the domain with a host-model CPU was started by an old libvirt
......@@ -7827,20 +7823,20 @@ qemuProcessRefreshCPU(virQEMUDriverPtr driver,
* running domain.
*/
if (vm->def->cpu->mode == VIR_CPU_MODE_HOST_MODEL) {
if (!(host = virCPUCopyMigratable(caps->host.cpu->arch, caps->host.cpu)))
goto cleanup;
if (!(hostmig = virCPUCopyMigratable(host->arch, host)))
return -1;
if (!(cpu = virCPUDefCopyWithoutModel(host)) ||
virCPUDefCopyModelFilter(cpu, host, false,
if (!(cpu = virCPUDefCopyWithoutModel(hostmig)) ||
virCPUDefCopyModelFilter(cpu, hostmig, false,
virQEMUCapsCPUFilterFeatures,
&caps->host.cpu->arch) < 0)
goto cleanup;
&host->arch) < 0)
return -1;
if (virCPUUpdate(vm->def->os.arch, vm->def->cpu, cpu) < 0)
goto cleanup;
return -1;
if (qemuProcessUpdateCPU(driver, vm, QEMU_ASYNC_JOB_NONE) < 0)
goto cleanup;
return -1;
} else if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION)) {
/* We only try to fix CPUs when the libvirt/QEMU combo used to start
* the domain did not know about query-cpu-model-expansion in which
......@@ -7848,16 +7844,10 @@ qemuProcessRefreshCPU(virQEMUDriverPtr driver,
* doesn't know about.
*/
if (qemuDomainFixupCPUs(vm, &priv->origCPU) < 0)
goto cleanup;
return -1;
}
ret = 0;
cleanup:
virCPUDefFree(cpu);
virCPUDefFree(host);
virObjectUnref(caps);
return ret;
return 0;
}
......
......@@ -54,8 +54,7 @@ fillStringValues(virDomainCapsStringValuesPtr values, ...)
# include "testutilshostcpus.h"
static int
fakeHostCPU(virCapsPtr caps,
virArch arch)
fakeHostCPU(virArch arch)
{
virCPUDefPtr cpu;
......@@ -66,7 +65,7 @@ fakeHostCPU(virCapsPtr caps,
return -1;
}
qemuTestSetHostCPU(caps, cpu);
qemuTestSetHostCPU(NULL, arch, cpu);
return 0;
}
......@@ -80,17 +79,15 @@ fillQemuCaps(virDomainCapsPtr domCaps,
{
int ret = -1;
char *path = NULL;
virCapsPtr caps = NULL;
virQEMUCapsPtr qemuCaps = NULL;
virDomainCapsLoaderPtr loader = &domCaps->os.loader;
virDomainVirtType virtType;
if (!(caps = virCapabilitiesNew(domCaps->arch, false, false)) ||
fakeHostCPU(caps, domCaps->arch) < 0)
if (fakeHostCPU(domCaps->arch) < 0)
goto cleanup;
path = g_strdup_printf("%s/%s.%s.xml", TEST_QEMU_CAPS_PATH, name, arch);
if (!(qemuCaps = qemuTestParseCapabilities(caps, path)))
if (!(qemuCaps = qemuTestParseCapabilitiesArch(domCaps->arch, path)))
goto cleanup;
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM))
......@@ -106,7 +103,7 @@ fillQemuCaps(virDomainCapsPtr domCaps,
if (!domCaps->machine)
domCaps->machine = g_strdup(virQEMUCapsGetPreferredMachine(qemuCaps, virtType));
if (virQEMUCapsFillDomainCaps(qemuCaps, caps->host.arch, domCaps,
if (virQEMUCapsFillDomainCaps(qemuCaps, domCaps->arch, domCaps,
false,
cfg->firmwares,
cfg->nfirmwares) < 0)
......@@ -134,7 +131,6 @@ fillQemuCaps(virDomainCapsPtr domCaps,
ret = 0;
cleanup:
virObjectUnref(caps);
virObjectUnref(qemuCaps);
VIR_FREE(path);
return ret;
......
......@@ -144,7 +144,6 @@ testQemuCapsCopy(const void *opaque)
int ret = -1;
const testQemuData *data = opaque;
char *capsFile = NULL;
virCapsPtr caps = NULL;
virQEMUCapsPtr orig = NULL;
virQEMUCapsPtr copy = NULL;
char *actual = NULL;
......@@ -153,11 +152,8 @@ testQemuCapsCopy(const void *opaque)
data->outputDir, data->prefix, data->version,
data->archName);
if (!(caps = virCapabilitiesNew(virArchFromString(data->archName),
false, false)))
goto cleanup;
if (!(orig = qemuTestParseCapabilities(caps, capsFile)))
if (!(orig = qemuTestParseCapabilitiesArch(
virArchFromString(data->archName), capsFile)))
goto cleanup;
if (!(copy = virQEMUCapsNewCopy(orig)))
......@@ -173,7 +169,6 @@ testQemuCapsCopy(const void *opaque)
cleanup:
VIR_FREE(capsFile);
virObjectUnref(caps);
virObjectUnref(orig);
virObjectUnref(copy);
VIR_FREE(actual);
......
......@@ -1733,7 +1733,7 @@ mymain(void)
DO_TEST_FAILURE("cpu-s390-features", QEMU_CAPS_KVM);
qemuTestSetHostArch(&driver, VIR_ARCH_NONE);
qemuTestSetHostCPU(driver.caps, cpuHaswell);
qemuTestSetHostCPU(&driver, driver.hostarch, cpuHaswell);
DO_TEST("cpu-Haswell", QEMU_CAPS_KVM);
DO_TEST("cpu-Haswell2", QEMU_CAPS_KVM);
DO_TEST("cpu-Haswell3", QEMU_CAPS_KVM);
......@@ -1744,7 +1744,7 @@ mymain(void)
DO_TEST_CAPS_VER("cpu-tsc-frequency", "4.0.0");
DO_TEST_CAPS_VER("cpu-translation", "4.0.0");
DO_TEST_CAPS_LATEST("cpu-translation");
qemuTestSetHostCPU(driver.caps, NULL);
qemuTestSetHostCPU(&driver, driver.hostarch, NULL);
DO_TEST("encrypted-disk", QEMU_CAPS_QCOW2_LUKS, QEMU_CAPS_OBJECT_SECRET);
DO_TEST("encrypted-disk-usage", QEMU_CAPS_QCOW2_LUKS, QEMU_CAPS_OBJECT_SECRET);
......@@ -1873,12 +1873,12 @@ mymain(void)
QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE,
QEMU_CAPS_KVM);
qemuTestSetHostCPU(driver.caps, cpuPower9);
qemuTestSetHostCPU(&driver, driver.hostarch, cpuPower9);
DO_TEST("pseries-cpu-compat-power9",
QEMU_CAPS_KVM,
QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE,
QEMU_CAPS_DEVICE_SPAPR_VTY);
qemuTestSetHostCPU(driver.caps, NULL);
qemuTestSetHostCPU(&driver, driver.hostarch, NULL);
qemuTestSetHostArch(&driver, VIR_ARCH_NONE);
......
......@@ -205,14 +205,6 @@ virCapsPtr testQemuCapsInit(void)
caps->host.secModels[0].model = g_strdup("none");
caps->host.secModels[0].doi = g_strdup("0");
if (!(cpuDefault = virCPUDefCopy(&cpuDefaultData)) ||
!(cpuHaswell = virCPUDefCopy(&cpuHaswellData)) ||
!(cpuPower8 = virCPUDefCopy(&cpuPower8Data)) ||
!(cpuPower9 = virCPUDefCopy(&cpuPower9Data)))
goto cleanup;
qemuTestSetHostCPU(caps, NULL);
if (!(caps->host.numa = virCapabilitiesHostNUMANewHost()))
goto cleanup;
......@@ -237,9 +229,6 @@ virCapsPtr testQemuCapsInit(void)
cleanup:
caps->host.cpu = NULL;
virCPUDefFree(cpuDefault);
virCPUDefFree(cpuHaswell);
virCPUDefFree(cpuPower8);
virObjectUnref(caps);
return NULL;
}
......@@ -255,16 +244,15 @@ qemuTestSetHostArch(virQEMUDriverPtr driver,
virTestHostArch = arch;
driver->hostarch = virArchFromHost();
driver->caps->host.arch = virArchFromHost();
qemuTestSetHostCPU(driver->caps, NULL);
qemuTestSetHostCPU(driver, arch, NULL);
}
void
qemuTestSetHostCPU(virCapsPtr caps,
qemuTestSetHostCPU(virQEMUDriverPtr driver,
virArch arch,
virCPUDefPtr cpu)
{
virArch arch = caps->host.arch;
if (!cpu) {
if (ARCH_IS_X86(arch))
cpu = cpuDefault;
......@@ -274,11 +262,19 @@ qemuTestSetHostCPU(virCapsPtr caps,
unsetenv("VIR_TEST_MOCK_FAKE_HOST_CPU");
if (cpu) {
caps->host.arch = cpu->arch;
if (cpu->model)
setenv("VIR_TEST_MOCK_FAKE_HOST_CPU", cpu->model, 1);
}
caps->host.cpu = cpu;
if (driver) {
if (cpu)
driver->caps->host.arch = cpu->arch;
driver->caps->host.cpu = cpu;
virCPUDefFree(driver->hostcpu);
if (cpu)
virCPUDefRef(cpu);
driver->hostcpu = cpu;
}
}
......@@ -300,17 +296,6 @@ qemuTestParseCapabilitiesArch(virArch arch,
}
virQEMUCapsPtr
qemuTestParseCapabilities(virCapsPtr caps,
const char *capsFile)
{
if (!caps)
return NULL;
return qemuTestParseCapabilitiesArch(caps->host.arch, capsFile);
}
void qemuTestDriverFree(virQEMUDriver *driver)
{
virMutexDestroy(&driver->lock);
......@@ -382,6 +367,12 @@ int qemuTestDriverInit(virQEMUDriver *driver)
memset(driver, 0, sizeof(*driver));
if (!(cpuDefault = virCPUDefCopy(&cpuDefaultData)) ||
!(cpuHaswell = virCPUDefCopy(&cpuHaswellData)) ||
!(cpuPower8 = virCPUDefCopy(&cpuPower8Data)) ||
!(cpuPower9 = virCPUDefCopy(&cpuPower9Data)))
return -1;
if (virMutexInit(&driver->lock) < 0)
return -1;
......@@ -439,6 +430,8 @@ int qemuTestDriverInit(virQEMUDriver *driver)
if (!(driver->securityManager = virSecurityManagerNewStack(mgr)))
goto error;
qemuTestSetHostCPU(driver, driver->hostarch, NULL);
return 0;
error:
......
......@@ -72,8 +72,6 @@ virDomainXMLOptionPtr testQemuXMLConfInit(void);
virQEMUCapsPtr qemuTestParseCapabilitiesArch(virArch arch,
const char *capsFile);
virQEMUCapsPtr qemuTestParseCapabilities(virCapsPtr caps,
const char *capsFile);
extern virCPUDefPtr cpuDefault;
extern virCPUDefPtr cpuHaswell;
......@@ -82,7 +80,8 @@ extern virCPUDefPtr cpuPower9;
void qemuTestSetHostArch(virQEMUDriverPtr driver,
virArch arch);
void qemuTestSetHostCPU(virCapsPtr caps,
void qemuTestSetHostCPU(virQEMUDriverPtr driver,
virArch arch,
virCPUDefPtr cpu);
int qemuTestDriverInit(virQEMUDriver *driver);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册