[libvirt] [PATCH 4/4] qemu: Fix qemuProcessInitCpuAffinity()
John Ferlan
jferlan at redhat.com
Tue Jun 4 11:03:35 UTC 2019
On 5/31/19 11:22 AM, Andrea Bolognani wrote:
> Commit f136b83139c6 made some changes in the way we set CPU
> affinity for QEMU processes, and while doing so unfortunately
> also introduced a logic bug in that it tried to use a NUMA node
> map where a CPU map was expected.
>
> Because of that, guests using <numatune> would suddenly fail to
> start:
>
> # virsh start guest
> error: Failed to start domain guest
> error: cannot set CPU affinity on process 40055: Invalid argument
>
> This was particularly easy to trigger on POWER 8 machines,
> where secondary threads always show up as offline in the host:
> having
>
> <numatune>
> <memory mode='strict' placement='static' nodeset='1'/>
> </numatune>
>
> in the guest configuration, for example, would result in libvirt
> trying to set the process affinity so that it would prefer
> running on CPU 1, but since that's a secondary thread and thus
> shows up as offline, the operation would fail, and so would
> starting the guest.
>
> Use the newly introduced virNumaNodesetToCPUset() to convert
> the NUMA node map to a CPU map, which in the example above would
> be 8-15 with CPU 8 showing up as online in the guest.
>
> https://bugzilla.redhat.com/show_bug.cgi?id=1703661
>
> Signed-off-by: Andrea Bolognani <abologna at redhat.com>
> ---
> src/qemu/qemu_process.c | 7 ++++++-
> 1 file changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index fa5909e9be..295ad2e1ff 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -2489,11 +2489,16 @@ qemuProcessInitCpuAffinity(virDomainObjPtr vm)
> if (virDomainNumaGetNodeCount(vm->def->numa) <= 1 &&
> virDomainNumatuneGetMode(vm->def->numa, -1, &mem_mode) == 0 &&
> mem_mode == VIR_DOMAIN_NUMATUNE_MEM_STRICT) {
> + virBitmapPtr nodeset = NULL;
> +
> if (virDomainNumatuneMaybeGetNodeset(vm->def->numa,
> priv->autoNodeset,
> - &cpumapToSet,
> + &nodeset,
> -1) < 0)
> goto cleanup;
> +
> + if (virNumaNodesetToCPUset(nodeset, &cpumapToSet) < 0)
> + goto cleanup;
Coverity complained this morning because virNumaNodesetToCPUset will
allocate something into @cpumapToSet which isn't free'd when this code
jumps to cleanup.
John
> } else if (vm->def->cputune.emulatorpin) {
> cpumapToSet = vm->def->cputune.emulatorpin;
> } else {
>
More information about the libvir-list
mailing list