[Libvir] [PATCH] an irregular value is set as 'CPU Affinity' by virsh vcpupin

Hi, There is a difference between 'CPU Affinity' of 'virsh vcpuinfo' and 'CPU Affinity' of 'xm vcpu-list' when I set the vcpu affinity by 'virsh vcpupin'. i.e. 'xm vcpu-list' shows wrong value. But there is no difference between them when I set by 'xm vcpu-pin'. (a) set by 'virsh vcpupin' # virsh vcpupin guest_dom 0 1 # virsh vcpuinfo guest_dom VCPU: 0 CPU: 1 State: blocked CPU time: 17.1s CPU Affinity: -y------ # xm vcpu-list guest_dom Name ID VCPUs CPU State Time(s) CPU Affinity guest_dom 13 0 1 -b- 17.1 any cpu (b) set by 'xm vcpu-pin' # xm vcpu-pin guest_dom 0 0 # virsh vcpuinfo guest_dom VCPU: 0 CPU: 0 State: blocked CPU time: 17.1s CPU Affinity: y------- # xm vcpu-list guest_dom Name ID VCPUs CPU State Time(s) CPU Affinity guest_dom 13 0 0 -b- 17.1 0 I guess that the allocated memory to cpumap must be 8-byte for Xen because "xc_vcpu_setaffinity@libxc/xc_domain.c" is using uint64_t as cpumap. But the libvirt is allocating only maplen size for cpumap. virsh +--- cpumaplen ---+ (more than 1-byte) xen +----------------- 8-byte -----------------+ (uint64_t) Then, an irregular value is set to the buffer that is more than the number of physical CPU, because libvirt initialize maplen size only (i.e. not initialize 8-byte buffer). So, I changed the size of cpumap and the value of nr_cpus at xen_internal.c. Regards, Saori Fukuta

On Tue, Jan 08, 2008 at 06:42:40PM +0900, Saori Fukuta wrote:
Hi,
There is a difference between 'CPU Affinity' of 'virsh vcpuinfo' and 'CPU Affinity' of 'xm vcpu-list' when I set the vcpu affinity by 'virsh vcpupin'. i.e. 'xm vcpu-list' shows wrong value. But there is no difference between them when I set by 'xm vcpu-pin'.
(a) set by 'virsh vcpupin' # virsh vcpupin guest_dom 0 1 # virsh vcpuinfo guest_dom VCPU: 0 CPU: 1 State: blocked CPU time: 17.1s CPU Affinity: -y------
# xm vcpu-list guest_dom Name ID VCPUs CPU State Time(s) CPU Affinity guest_dom 13 0 1 -b- 17.1 any cpu
(b) set by 'xm vcpu-pin' # xm vcpu-pin guest_dom 0 0 # virsh vcpuinfo guest_dom VCPU: 0 CPU: 0 State: blocked CPU time: 17.1s CPU Affinity: y-------
# xm vcpu-list guest_dom Name ID VCPUs CPU State Time(s) CPU Affinity guest_dom 13 0 0 -b- 17.1 0
I guess that the allocated memory to cpumap must be 8-byte for Xen because "xc_vcpu_setaffinity@libxc/xc_domain.c" is using uint64_t as cpumap. But the libvirt is allocating only maplen size for cpumap. virsh +--- cpumaplen ---+ (more than 1-byte) xen +----------------- 8-byte -----------------+ (uint64_t)
Then, an irregular value is set to the buffer that is more than the number of physical CPU, because libvirt initialize maplen size only (i.e. not initialize 8-byte buffer).
Ok I understand what's going on now - Xen expects the CPU map to be exactly 8 bytes long, but libvirt only requires that it be large enough to hold the desired mapping. So the map passed in by the libvirt caller may be too small so the HV ends up reading garbage. This patch looks good to me. Dan. -- |=- Red Hat, Engineering, Emerging Technologies, Boston. +1 978 392 2496 -=| |=- Perl modules: http://search.cpan.org/~danberr/ -=| |=- Projects: http://freshmeat.net/~danielpb/ -=| |=- GnuPG: 7D3B9505 F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 -=|

On Wed, Jan 09, 2008 at 04:02:05AM +0000, Daniel P. Berrange wrote:
On Tue, Jan 08, 2008 at 06:42:40PM +0900, Saori Fukuta wrote:
Hi,
There is a difference between 'CPU Affinity' of 'virsh vcpuinfo' and 'CPU Affinity' of 'xm vcpu-list' when I set the vcpu affinity by 'virsh vcpupin'. i.e. 'xm vcpu-list' shows wrong value. But there is no difference between them when I set by 'xm vcpu-pin'.
(a) set by 'virsh vcpupin' # virsh vcpupin guest_dom 0 1 # virsh vcpuinfo guest_dom VCPU: 0 CPU: 1 State: blocked CPU time: 17.1s CPU Affinity: -y------
# xm vcpu-list guest_dom Name ID VCPUs CPU State Time(s) CPU Affinity guest_dom 13 0 1 -b- 17.1 any cpu
(b) set by 'xm vcpu-pin' # xm vcpu-pin guest_dom 0 0 # virsh vcpuinfo guest_dom VCPU: 0 CPU: 0 State: blocked CPU time: 17.1s CPU Affinity: y-------
# xm vcpu-list guest_dom Name ID VCPUs CPU State Time(s) CPU Affinity guest_dom 13 0 0 -b- 17.1 0
I guess that the allocated memory to cpumap must be 8-byte for Xen because "xc_vcpu_setaffinity@libxc/xc_domain.c" is using uint64_t as cpumap. But the libvirt is allocating only maplen size for cpumap. virsh +--- cpumaplen ---+ (more than 1-byte) xen +----------------- 8-byte -----------------+ (uint64_t)
Then, an irregular value is set to the buffer that is more than the number of physical CPU, because libvirt initialize maplen size only (i.e. not initialize 8-byte buffer).
Ok I understand what's going on now - Xen expects the CPU map to be exactly 8 bytes long, but libvirt only requires that it be large enough to hold the desired mapping. So the map passed in by the libvirt caller may be too small so the HV ends up reading garbage. This patch looks good to me.
I've tested and confirmed this is working as described, so have committed the patch. Dan. -- |=- Red Hat, Engineering, Emerging Technologies, Boston. +1 978 392 2496 -=| |=- Perl modules: http://search.cpan.org/~danberr/ -=| |=- Projects: http://freshmeat.net/~danielpb/ -=| |=- GnuPG: 7D3B9505 F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 -=|
participants (2)
-
Daniel P. Berrange
-
Saori Fukuta