[libvirt] vcpupin: fix cpu affinity setting bug of qemu driver

Osier Yang jyang at redhat.com
Tue Jun 7 10:16:51 UTC 2011


On 06/07/2011 12:52 PM, Taku Izumi wrote:
>
> There is the case where cpu affinites for vcpu of qemu doesn't work
> correctly.
> For example, if only one vcpupin setting entry is provided and its setting
> is
> not for vcpu0, it doesn't work.
>
>     # virsh dumpxml VM
>     ...
>     <vcpu>4</vcpu>
>     <cputune>
>       <vcpupin vcpu='3' cpuset='9-11'/>
>     </cputune>
>     ...
>
>     # virsh start VM
>     Domain VM started
>
>     # virsh vcpuinfo VM
>     VCPU:           0
>     CPU:            31
>     State:          running
>     CPU time:       2.5s
>     CPU Affinity:   yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
>
>     VCPU:           1
>     CPU:            12
>     State:          running
>     CPU time:       0.9s
>     CPU Affinity:   yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
>
>     VCPU:           2
>     CPU:            30
>     State:          running
>     CPU time:       1.5s
>     CPU Affinity:   yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
>
>     VCPU:           3
>     CPU:            13
>     State:          running
>     CPU time:       1.7s
>     CPU Affinity:   yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
>
>
> This patch fixes this problem.
>
> Signed-off-by: Taku Izumi<izumi.taku at jp.fujitsu.com>
> ---
>   src/qemu/qemu_process.c |   10 ++++------
>   1 file changed, 4 insertions(+), 6 deletions(-)
>
> Index: libvirt/src/qemu/qemu_process.c
> ===================================================================
> --- libvirt.orig/src/qemu/qemu_process.c
> +++ libvirt/src/qemu/qemu_process.c
> @@ -1194,7 +1194,7 @@ qemuProcessSetVcpuAffinites(virConnectPt
>       virNodeInfo nodeinfo;
>       pid_t vcpupid;
>       unsigned char *cpumask;
> -    int vcpu, cpumaplen, hostcpus, maxcpu;
> +    int vcpu, cpumaplen, hostcpus, maxcpu, n;
>       unsigned char *cpumap = NULL;
>       int ret = -1;
>
> @@ -1223,14 +1223,12 @@ qemuProcessSetVcpuAffinites(virConnectPt
>           return -1;
>       }
>
> -    for (vcpu = 0; vcpu<  def->cputune.nvcpupin; vcpu++) {
> -        if (vcpu != def->cputune.vcpupin[vcpu]->vcpuid)
> -            continue;

Looks good to me, thanks for fixing it, ACK

Regards
Osier

> -
> +    for (n = 0; n<  def->cputune.nvcpupin; n++) {
>           int i;
> +        vcpu =  def->cputune.vcpupin[n]->vcpuid;
>
>           memset(cpumap, 0, cpumaplen);
> -        cpumask = (unsigned char *)def->cputune.vcpupin[vcpu]->cpumask;
> +        cpumask = (unsigned char *)def->cputune.vcpupin[n]->cpumask;
>           vcpupid = priv->vcpupids[vcpu];
>
>           /* Convert cpumask to bitmap here. */
>
>





More information about the libvir-list mailing list