
On Wed, Oct 10, 2012 at 02:05:25PM +0200, Viktor Mihajlovski wrote:
The macro VIR_NODEINFO_MAXCPUS computes the maximum number of supported CPUs for a node as the product of sockets, cores and threads from the virNodeInfo structure. Since topology cannot be discovered for offline CPUs, any of the values for sockets, cores or threads can be wrong (too small). As a consequence the per-VCPU CPU masks are truncated incorrectly and it's impossible to correlate the bits in the masks with actual CPUs on the host.
Example: Host has 3 logical CPUs, 1 socket, 3 cores, 1 thread. Guest has 1 virtual CPU and is started while all 3 host CPUs are online.
$ virsh vcpuinfo guest VCPU: 0 CPU: 0 State: running CPU time: 35.4s CPU Affinity: yyy
$ echo 0 > /sys/devices/system/cpu/cpu1/online
$ virsh vcpuinfo guest VCPU: 0 CPU: 0 State: running CPU time: 35.5s CPU Affinity: y-
The correct display for CPU affinity would have been y-y, as the guest continues to use CPUs 0 and 2. This is not a display problem only, because it is also not possible to explicitly pin the virtual CPU to host CPUs 0 and 2, due to the truncated CPU mask.
To prevent this, the following changes have been made:
1. In virNodeParseNode count all logical CPUs, offline or online and pass them back in a new argument 'maxcpus'. 2. Extend the virNodeInfo struct with a new member 'maxcpus' containing the number of all logical CPUs, online and offline. 3. Change the macro VIR_NODEINFO_MAXCPUS to return virNodeInfo.maxpus
Signed-off-by: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com> --- include/libvirt/libvirt.h.in | 3 ++- src/nodeinfo.c | 17 +++++++++++++---- src/remote/remote_protocol.x | 1 + src/remote_protocol-structs | 1 + 4 files changed, 17 insertions(+), 5 deletions(-)
diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in index 81f12a4..16265b5 100644 --- a/include/libvirt/libvirt.h.in +++ b/include/libvirt/libvirt.h.in @@ -445,6 +445,7 @@ struct _virNodeInfo { total number of CPU sockets otherwise */ unsigned int cores; /* number of cores per socket */ unsigned int threads;/* number of threads per core */ + unsigned int maxcpus;/* number of maximum cpus - online and offline */ };
NACK, this breaks ABI compatibility of the public API
diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x index b0b530c..40883d0 100644 --- a/src/remote/remote_protocol.x +++ b/src/remote/remote_protocol.x @@ -465,6 +465,7 @@ struct remote_node_get_info_ret { /* insert@1 */ int sockets; int cores; int threads; + int maxcpus; };
NACK, this breaks ABI compatibility of the wire protocol Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|