• D
    qemu: fix setting of VM CPU affinity with TCG · a103bb10
    Daniel P. Berrange 提交于
    If a previous commit I fixed the incorrect handling of vcpu pids
    for TCG mode QEMU:
    
      commit b07f3d82
      Author: Daniel P. Berrange <berrange@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: NDaniel P. Berrange <berrange@redhat.com>
    a103bb10
qemu_process.c 181.0 KB