[Libvir] Bug in the virDomainGetInfo() API of libvirt 0.1.9 with Xen 3.0.3

Daniel P. Berrange berrange at redhat.com
Fri Jan 12 14:41:16 UTC 2007


On Fri, Jan 12, 2007 at 02:24:12PM +0000, Daniel P. Berrange wrote:
> On Fri, Jan 12, 2007 at 03:04:57PM +0100, Philippe Berthault wrote:
> > Daniel Veillard a écrit :
> > >  I think Xen just returns -1 when the field is uninitialized, probably
> > >meaning 'all physical memory'. Once you use "xm mem-max 0 ..." then it
> > >consider the Dom0 domain constrained, but not before. And since there
> > >are machine where it's possible to hot plug new memory this is a way to
> > >not poll the current physical memory, a bit weird but that can be 
> > >understood.
> > >  
> > The signed value -1, "casted" in C/C++ in unsigned integer, gives the 
> > value 4294967295. The Max memory value returned by virsh is 4294967292. 
> > There is a small difference (3), so the value returned by Xen can't be -1.
> 
> You're forgetting though, that xen measures this in terms of pages. Libvirt
> converts that to bytes. The virsh converts it to KB when printing it.
> 
> $cat > demo.c <<EOF
> 
> #include <stdio.h>
> 
> int main() {
>   unsigned int max_pages = ~0U;
>   unsigned long long mem = (unsigned long long)max_pages * 4096ull;
>   unsigned long memkb = mem / 1024;
> 
>   printf("%u %llu %lu\n",
> 	 max_pages,
> 	 mem,
> 	 memkb);
> }
> 
> EOF
> $ gcc -o demo demo.c 
> $ ./demo 
> 4294967295 17592186040320 4294967292

Oh wait, a minute, this is bogus - the last figure should be *4 the first
figure - which it clearly isn't. Well, it works on 64-bit platforms, but
on 32-bit platforms the 'unsigned long memkb = mem/1024' bit is overflowing.
It should be reporting 17179869180 kB.  Still, this is just a bug in virsh
when printing out the data - the raw data from virDomainGetInfo() is the
correct value.

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  -=| 




More information about the libvir-list mailing list