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@xxxxxxxxxxxxxxxxxx> > --- > 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 :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list