[libvirt] [PATCH] qemu: fix setting of VM CPU affinity with TCG

Serge Hallyn serge.hallyn at ubuntu.com
Tue Feb 10 18:36:15 UTC 2015


Quoting Daniel P. Berrange (berrange at redhat.com):
> If a previous commit I fixed the incorrect handling of vcpu pids
> for TCG mode QEMU:
> 
>   commit b07f3d821dfb11a118ee75ea275fd6ab737d9500
>   Author: Daniel P. Berrange <berrange at redhat.com>
>   Date:   Thu Dec 18 16:34:39 2014 +0000
> 
>     Don't setup fake CPU pids for old QEMU
> 
>     The code assumes that def->vcpus == nvcpupids, so when we setup
>     fake CPU pids for old QEMU with nvcpupids == 1, we cause the
>     later code to read off the end of the array. This has fun results
>     like sche_setaffinity(0, ...) which changes libvirtd's own CPU
>     affinity, or even better sched_setaffinity($RANDOM, ...) which
>     changes the affinity of a random OS process.
> 
> The intent was that this would merely disable the ability to set
> per-vCPU affinity. It should still have been possible to set VM
> level host CPU affinity.
> 
> Unfortunately, when you set  <vcpu cpuset='0-1'>4</vcpu>, the XML
> parser will internally take this & initialize an entry in the
> def->cputune.vcpupin array for every VCPU. IOW this is implicitly
> being treated as
> 
>   <cputune>
>     <vcpupin cpuset='0-1' vcpu='0'/>
>     <vcpupin cpuset='0-1' vcpu='1'/>
>     <vcpupin cpuset='0-1' vcpu='2'/>
>     <vcpupin cpuset='0-1' vcpu='3'/>
>   </cputune>
> 
> Even more fun, the faked cputune elements are hidden from view when
> querying the live XML, because their cpuset mask is the same as the
> VM default cpumask.
> 
> The upshot was that it was impossible to set VM level CPU affinity.
> 
> To fix this we must update qemuProcessSetVcpuAffinities so that it
> only reports a fatal error if the per-VCPU cpu mask is different
> from the VM level cpu mask.
> 
> Signed-off-by: Daniel P. Berrange <berrange at redhat.com>

Thanks, confirmed this let's me place qemu in a cpuset.  (Noting that
'virsh edit' always ends up squashing the cputune section when the 
cpusets are identical, but that should all be reasonable)

Acked-by: Serge E. Hallyn <serge.hallyn at ubuntu.com>
Tested-by: Serge E. Hallyn <serge.hallyn at ubuntu.com>

> ---
>  src/qemu/qemu_process.c | 15 ++++++++++++---
>  1 file changed, 12 insertions(+), 3 deletions(-)
> 
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index d5df60d..e8c532f 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -2497,9 +2497,18 @@ qemuProcessSetVcpuAffinities(virDomainObjPtr vm)
>          return 0;
>  
>      if (priv->vcpupids == NULL) {
> -        virReportError(VIR_ERR_OPERATION_INVALID,
> -                       "%s", _("cpu affinity is not supported"));
> -        return -1;
> +        /* If any CPU has custom affinity that differs from the
> +         * VM default affinity, we must reject it
> +         */
> +        for (n = 0; n < def->vcpus; n++) {
> +            if (!virBitmapEqual(def->cpumask,
> +                                def->cputune.vcpupin[n]->cpumask)) {
> +                virReportError(VIR_ERR_OPERATION_INVALID,
> +                               "%s", _("cpu affinity is not supported"));
> +                return -1;
> +            }
> +        }
> +        return 0;
>      }
>  
>      for (n = 0; n < def->vcpus; n++) {
> -- 
> 2.1.0
> 




More information about the libvir-list mailing list