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(a)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 :|