[libvirt] [PATCH] qemu: Allow use of hot plugged host CPUs if no affinity set
John Ferlan
jferlan at redhat.com
Wed Nov 23 17:03:22 UTC 2016
On 11/04/2016 04:01 AM, Viktor Mihajlovski wrote:
> Running VMs couldn't use newly hot plugged host CPUs even if the VMs
> had no CPU pinning defined AND the cpuset controller was disabled in
> the libvirt qemu configuration.
Add blank lines between paragraphs - just makes it easier to read.
> This was because in this case the process affinity was set by libvirt
> to all currently present host CPUs in order to avoid situations, where
> libvirtd was deliberately running on a CPU subset and thus the spawned
> VMs would be involuntarily restricted to the CPU subset inherited by
> libvirtd.
> That however prevents new host CPUs to be utilized when they show up.
> With this change we will NOT set the VM's affinity mask if it
> matches the online host CPU mask.
>
> There's still the chance that for some reason the deliberately chosen
> libvirtd affinity matches the online host CPU mask by accident. In this
> case the behavior remains as it was before (CPUs offline while setting
> the affinity will not be used if they show up later on).
>
> Signed-off-by: Viktor Mihajlovski <mihajlov at linux.vnet.ibm.com>
> Tested-by: Matthew Rosato <mjrosato at linux.vnet.ibm.com>
> ---
> src/qemu/qemu_process.c | 12 ++++++++++++
> 1 file changed, 12 insertions(+)
>
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index 1b67aee..76f9210 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -2202,6 +2202,7 @@ qemuProcessInitCpuAffinity(virDomainObjPtr vm)
> int ret = -1;
> virBitmapPtr cpumap = NULL;
> virBitmapPtr cpumapToSet = NULL;
> + virBitmapPtr hostcpumap = NULL;
> qemuDomainObjPrivatePtr priv = vm->privateData;
>
> if (!vm->pid) {
> @@ -2223,6 +2224,16 @@ qemuProcessInitCpuAffinity(virDomainObjPtr vm)
> * the spawned QEMU instance to all pCPUs if no map is given in
> * its config file */
> int hostcpus;
> + hostcpumap = virHostCPUGetOnlineBitmap();
> + cpumap = virProcessGetAffinity(vm->pid);
Wouldn't this set 'cpumap' to something that shortly would be
overwritten by virBitmapNew if we don't jump to cleanup in this patch?
Beyond that - I'll let someone with more detailed knowledge of
SetAffinity nuances decide whether avoiding the call is proper.
John
> +
> + if (hostcpumap && cpumap && virBitmapEqual(hostcpumap, cpumap)) {
> + /* we're using all available CPUs, no reason to set
> + * mask. If libvirtd is running without explicit
> + * affinity, we can use hotplugged CPUs for this VM */
> + ret = 0;
> + goto cleanup;
> + }
>
> /* setaffinity fails if you set bits for CPUs which
> * aren't present, so we have to limit ourselves */
> @@ -2248,6 +2259,7 @@ qemuProcessInitCpuAffinity(virDomainObjPtr vm)
>
> cleanup:
> virBitmapFree(cpumap);
> + virBitmapFree(hostcpumap);
> return ret;
> }
>
>
More information about the libvir-list
mailing list