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