Quoting Daniel P. Berrange (berra...@redhat.com): > If a previous commit I fixed the incorrect handling of vcpu pids > for TCG mode QEMU: > > commit b07f3d821dfb11a118ee75ea275fd6ab737d9500 > Author: Daniel P. Berrange <berra...@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 <berra...@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.hal...@ubuntu.com> Tested-by: Serge E. Hallyn <serge.hal...@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 > -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list