From: Wim ten Have <wim.ten.have@xxxxxxxxxx> The QEMU driver can erroneously allocate more vpus to a domain than there are cpus in the domain if the <numa> element is used to describe <cpu> element topology. Fix this by calculating the number of cpus described in the <numa> element of a <cpu> element and comparing it to the number of vcpus. If the number of vcpus is greater than the number of cpus, cap the number of vcpus to the number of cpus. This patch also adds a small libvirt documentation update under the "CPU Allocation" section. Signed-off-by: Wim ten Have <wim.ten.have@xxxxxxxxxx> --- docs/formatdomain.html.in | 9 ++++++++- src/conf/domain_conf.c | 14 +++++++++++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 07208ee..3c85307 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -501,7 +501,14 @@ <dt><code>vcpu</code></dt> <dd>The content of this element defines the maximum number of virtual CPUs allocated for the guest OS, which must be between 1 and - the maximum supported by the hypervisor. + the maximum supported by the hypervisor. If a <code>numa</code> + element is contained within the <code>cpu</code> element, the + number of virtual CPUs to be allocated is compared with the sum + of the <code>cpus</code> attributes across the <code>cell</code> + elements within the <code>numa</code> element. If the number of + virtual CPUs is greater than the sum of the <code>cpus</code> + attributes, the number of virtual CPUs is capped at sum of the + <code>cpus</code> attributes. <dl> <dt><code>cpuset</code></dt> <dd> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 958a5b7..73d7f4f 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -3844,12 +3844,20 @@ virDomainDefPostParseMemory(virDomainDefPtr def, unsigned long long numaMemory = 0; unsigned long long hotplugMemory = 0; - /* Attempt to infer the initial memory size from the sum NUMA memory sizes - * in case ABI updates are allowed or the <memory> element wasn't specified */ + /* Attempt to infer the initial memory size from the sum NUMA memory + * sizes in case ABI updates are allowed or the <memory> element + * wasn't specified. Also cap the vcpu count to the sum of NUMA cpus + * allocated for all nodes. */ if (def->mem.total_memory == 0 || parseFlags & VIR_DOMAIN_DEF_PARSE_ABI_UPDATE || - parseFlags & VIR_DOMAIN_DEF_PARSE_ABI_UPDATE_MIGRATION) + parseFlags & VIR_DOMAIN_DEF_PARSE_ABI_UPDATE_MIGRATION) { + unsigned int numaVcpus = 0; + + if ((numaVcpus = virDomainNumaGetCPUCountTotal(def->numa))) + virDomainDefSetVcpus(def, numaVcpus); + numaMemory = virDomainNumaGetMemorySize(def->numa); + } /* calculate the sizes of hotplug memory */ for (i = 0; i < def->nmems; i++) -- 2.9.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list