The virCapsPtr object is a serious source of performance problems for
the QEMU driver, because populating it means probing every QEMU system
emulator binary installed on the host.
This is is crazy because parsing any single XML document only ever needs
information about a single QEMU binary.
We've already done a great job of untangling stuff with the post-parse
and validation functions, but the job was never quite finished. This
series tackles the last pieces so that parsing & formatting XML will
never use the virCapsPtr object directly. Some of the virt drivers will
still use virCapsPtr in their private callbacks, but the QEMU driver
will instead use the QEMU emulator capabilities cache directly.
The first ten patches are the key bits of work to remove use of the
virCapsPtr parameter from domain XML APIs.
The next thirteen patches remove the (now unused) virCapsPtr parameter
from the domain XML APIs & their callers.
The final six patches help various QEMU driver APIs stop relying
on the virCapsPtr, so that it is no longer even created at startup.
This has a nice benefit on libvirtd startup tie when all 30 QEMU
emulators are installed, reducing it from 4 seconds down to a
fraction of a second.
More work is still needed to follow on from this...
A couple of places in the QEMU driver still use virCapsPtr
- The virConnectGetVersion API.
- The virNodeGetSecurityModel API.
- virDomainGetResctrlMonData API.
In all cases we just need to move to store the relevant data directly
in virQEMUDriverPtr, and not use the virCaps.
next, apps can use virDomainGetCapabilities to fetch info about a
specific QEMU binary they care about to avoid the cost of the
virConnectGetCapabilities API.
There are still times when apps need info in virConnectGetCapabilities
and this will annoyingly probe all QEMU binaries, even though the app
doesn't want the guest info.
virConnectGetCapabilities is one of our very early APIs which now flags
parameter, so this problem is unfixable in that API.
I'm thus included to introduce a new virNodeGetCapabilities that is
specifically only returning information about the host hypervisor.
Essentially the <capabilities> schema, but only the <host> sub-tree.
I do, however, wonder if even this is overkill & we should aim for a
much more fine grained way for reporting host capabilities.
eg if an app wants the host CPU, do they really want to pay the
penality to probe host cache nformation, or NUMA topology and
vica-verca.
I'm not sure what the right kind of tradeoff here is, whether we should
try individual APIs, or have one API and a set of flags to control what
info is filled in.
Daniel P. Berrangé (30):
qemu: cache host arch separately from virCapsPtr
qemu: add machines & arch to fake test capabilities cache
conf: sanitize virDomainSaveStatus & virDomainSaveConfig APIs
conf: sanitize virDomainObjFormat & virDomainDefFormat* APIs
conf: pass in default architecture via domain XML options
conf: move virt type / os type / arch validation to post-parse
conf: don't use passed in caps in post parse method
conf: pass netprefix in the domain parser config struct
conf: move seclabel validation into post-parse phase
conf: pass default sec model in parser config
conf: drop virCapsPtr param from assign addresses callback
conf: drop virCapsPtr param from basic post parse callback
conf: drop virCapsPtr param from post parse data alloc callback
conf: drop virCapsPtr param from post parse callback
conf: drop virCapsPtr param from device post parse callback
conf: drop virCapsPtr param from domain validate callback
conf: drop virCapsPtr param from domain formatting APIs
conf: drop virCapsPtr param from domain post parse & validate APIs
conf: drop virCapsPtr param from domain parse APIs
conf: drop virCapsPtr param from domain APIs for copying config
conf: drop virCapsPtr param from APIs for saving domains
conf: drop virCapsPtr param from domain obj list APIs
conf: drop virCapsPtr param from snapshot & checkpoint APIs
qemu: drop virCapsPtr param & vars from many APIs
conf: move NUMA capabilities into self contained object
qemu: use NUMA capabilities object directly
conf: make virCPUDef into a ref counted struct
qemu: use host CPU object directly
qemu: directly create virResctrlInfo ignoring capabilities
qemu: stop creating capabilities at driver startup
docs/formatdomain.html.in | 6 +-
src/bhyve/bhyve_domain.c | 16 +-
src/bhyve/bhyve_driver.c | 46 +-
src/bhyve/bhyve_process.c | 22 +-
src/conf/capabilities.c | 217 +++++---
src/conf/capabilities.h | 34 +-
src/conf/checkpoint_conf.c | 21 +-
src/conf/checkpoint_conf.h | 2 -
src/conf/cpu_conf.c | 29 +-
src/conf/cpu_conf.h | 4 +
src/conf/domain_conf.c | 404 ++++++--------
src/conf/domain_conf.h | 84 ++-
src/conf/snapshot_conf.c | 28 +-
src/conf/snapshot_conf.h | 3 -
src/conf/virconftypes.h | 3 +
src/conf/virdomainobjlist.c | 9 +-
src/conf/virdomainobjlist.h | 1 -
src/cpu/cpu.c | 3 +-
src/cpu/cpu_arm.c | 5 +-
src/cpu/cpu_ppc64.c | 3 +-
src/cpu/cpu_x86.c | 6 +-
src/esx/esx_driver.c | 14 +-
src/hyperv/hyperv_driver.c | 1 +
src/libvirt_private.syms | 18 +-
src/libxl/libxl_capabilities.c | 23 +-
src/libxl/libxl_conf.c | 3 +-
src/libxl/libxl_conf.h | 2 +-
src/libxl/libxl_domain.c | 37 +-
src/libxl/libxl_driver.c | 83 ++-
src/libxl/libxl_migration.c | 20 +-
src/libxl/xen_xl.c | 13 +-
src/libxl/xen_xm.c | 2 +-
src/lxc/lxc_conf.c | 9 +-
src/lxc/lxc_conf.h | 2 +-
src/lxc/lxc_controller.c | 44 +-
src/lxc/lxc_domain.c | 13 +-
src/lxc/lxc_driver.c | 98 ++--
src/lxc/lxc_native.c | 4 +-
src/lxc/lxc_process.c | 20 +-
src/openvz/openvz_conf.c | 62 ++-
src/openvz/openvz_conf.h | 1 +
src/openvz/openvz_driver.c | 64 +--
src/phyp/phyp_driver.c | 26 +-
src/qemu/qemu_capabilities.c | 176 ++++---
src/qemu/qemu_capabilities.h | 12 +-
src/qemu/qemu_capspriv.h | 10 +
src/qemu/qemu_checkpoint.c | 32 +-
src/qemu/qemu_checkpoint.h | 1 -
src/qemu/qemu_command.c | 6 +-
src/qemu/qemu_conf.c | 57 +-
src/qemu/qemu_conf.h | 18 +-
src/qemu/qemu_domain.c | 108 ++--
src/qemu/qemu_domain.h | 1 -
src/qemu/qemu_driver.c | 293 ++++-------
src/qemu/qemu_hotplug.c | 8 +-
src/qemu/qemu_migration.c | 36 +-
src/qemu/qemu_migration_cookie.c | 8 +-
src/qemu/qemu_process.c | 196 +++----
src/security/virt-aa-helper.c | 2 +-
src/test/test_driver.c | 45 +-
src/util/virresctrl.h | 2 +
src/vbox/vbox_common.c | 16 +-
src/vmware/vmware_conf.c | 2 +-
src/vmware/vmware_driver.c | 25 +-
src/vmx/vmx.c | 23 +-
src/vmx/vmx.h | 2 +-
src/vz/vz_driver.c | 29 +-
tests/Makefile.am | 17 +-
tests/bhyveargv2xmltest.c | 2 +-
tests/bhyvexml2argvtest.c | 2 +-
tests/cputest.c | 11 +-
tests/domaincapstest.c | 14 +-
tests/domainconftest.c | 2 +-
tests/libxlxml2domconfigtest.c | 22 +-
tests/lxcconf2xmltest.c | 17 +-
tests/lxcxml2xmltest.c | 13 +-
tests/openvzutilstest.c | 8 +-
tests/qemuagenttest.c | 2 +-
tests/qemublocktest.c | 2 +-
tests/qemucapabilitiestest.c | 9 +-
tests/qemudomaincheckpointxml2xmltest.c | 4 +-
tests/qemudomainsnapshotxml2xmltest.c | 4 +-
tests/qemuhotplugtest.c | 11 +-
tests/qemumemlocktest.c | 6 +-
tests/qemusecuritytest.c | 1 -
tests/qemuxml2argvtest.c | 35 +-
tests/qemuxml2xmltest.c | 4 +-
tests/securityselinuxlabeltest.c | 2 +-
tests/testutils.c | 39 +-
tests/testutils.h | 5 +-
tests/testutilslxc.c | 34 +-
tests/testutilslxc.h | 4 +
tests/testutilsqemu.c | 670 +++++++-----------------
tests/testutilsqemu.h | 9 +-
tests/testutilsxen.c | 34 +-
tests/testutilsxen.h | 9 +-
tests/vircaps2xmltest.c | 6 +-
tests/vircapstest.c | 11 +-
tests/vmx2xmltest.c | 4 +-
tests/xlconfigtest.c | 27 +-
tests/xmconfigtest.c | 23 +-
tests/xml2vmxtest.c | 4 +-
102 files changed, 1687 insertions(+), 1993 deletions(-)
--
2.23.0