Hey Daniel,<div><br></div><div>I just patched the source and compiled. It properly reports the free memory now:</div><div><br></div><div><div>[root@node1 ~]# python</div><div>Python 2.4.3 (#1, Jan 21 2009, 01:10:13) </div>
<div>[GCC 4.1.2 20071124 (Red Hat 4.1.2-42)] on linux2</div><div>Type "help", "copyright", "credits" or "license" for more information.</div><div>>>> import libvirt</div><div>
>>> conn = libvirt.open('xen:///')</div><div>>>> print(conn.getFreeMemory())</div><div>134217728</div><div><br></div><div>Thanks for all your help!</div><div><br></div><div>Hany</div><br><div class="gmail_quote">
On Fri, Jun 12, 2009 at 10:44 AM, Daniel P. Berrange <span dir="ltr"><<a href="mailto:berrange@redhat.com">berrange@redhat.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="im">On Thu, Jun 11, 2009 at 02:37:57PM -0400, Hany Fahim wrote:<br>
> Thanks Daniel,<br>
> Is it fair to assume this fix may appear in the next release of libvirt?<br>
<br>
</div>If you want to build from source, I'd appreciate feedback on whether<br>
the following patch fixes the problem<br>
<br>
diff -r f204769dd197 src/xen_internal.c<br>
--- a/src/xen_internal.c        Wed Jun 03 13:52:06 2009 +0000<br>
+++ b/src/xen_internal.c        Fri Jun 12 15:44:05 2009 +0100<br>
@@ -241,6 +241,15 @@ struct xen_v2s4_availheap {<br>
<br>
 typedef struct xen_v2s4_availheap  xen_v2s4_availheap;<br>
<br>
+struct xen_v2s5_availheap {<br>
+    uint32_t min_bitwidth;  /* Smallest address width (zero if don't care). */<br>
<div class="im">+    uint32_t max_bitwidth;  /* Largest address width (zero if don't care). */<br>
</div>+    int32_t  node;          /* NUMA node (-1 for sum across all nodes). */<br>
+    uint64_t avail_bytes ALIGN_64;   /* Bytes available in the specified region. */<br>
+};<br>
+<br>
+typedef struct xen_v2s5_availheap  xen_v2s5_availheap;<br>
+<br>
<br>
 #define XEN_GETDOMAININFOLIST_ALLOC(domlist, size)                      \<br>
     (hypervisor_version < 2 ?                                           \<br>
@@ -650,6 +659,7 @@ struct xen_op_v2_sys {<br>
         xen_v2s3_getdomaininfolistop getdomaininfolists3;<br>
         xen_v2_getschedulerid        getschedulerid;<br>
         xen_v2s4_availheap           availheap;<br>
+        xen_v2s5_availheap           availheap5;<br>
         uint8_t padding[128];<br>
     } u;<br>
 };<br>
@@ -3125,12 +3135,18 @@ xenHypervisorNodeGetCellsFreeMemory(virC<br>
     op_sys.cmd = XEN_V2_OP_GETAVAILHEAP;<br>
<br>
     for (i = startCell, j = 0;(i < priv->nbNodeCells) && (j < maxCells);i++,j++) {<br>
-        op_sys.u.availheap.node = i;<br>
+        if (sys_interface_version >= 5)<br>
+            op_sys.u.availheap5.node = i;<br>
+        else<br>
+            op_sys.u.availheap.node = i;<br>
         ret = xenHypervisorDoV2Sys(priv->handle, &op_sys);<br>
         if (ret < 0) {<br>
             return(-1);<br>
         }<br>
-        freeMems[j] = op_sys.u.availheap.avail_bytes;<br>
+        if (sys_interface_version >= 5)<br>
+            freeMems[j] = op_sys.u.availheap5.avail_bytes;<br>
+        else<br>
+            freeMems[j] = op_sys.u.availheap.avail_bytes;<br>
     }<br>
     return (j);<br>
<div class="im"> }<br>
<br>
<br>
<br>
> ><br>
> ><br>
> > This shows that the Hypervisor  is giving correct info back with both<br>
> > versions. So the problem must be at the libvirt space, and I believe<br>
> > I know what the problem is.<br>
> ><br>
> > The version of Xen in RHEL5 has<br>
> ><br>
> > struct xen_sysctl_availheap {<br>
> >    /* IN variables. */<br>
> >    uint32_t min_bitwidth;  /* Smallest address width (zero if don't care).<br>
> > */<br>
> >    uint32_t max_bitwidth;  /* Largest address width (zero if don't care).<br>
> > */<br>
> >    int32_t  node;          /* NUMA node of interest (-1 for all nodes). */<br>
> >    /* OUT variables. */<br>
> >    uint64_t avail_bytes;   /* Bytes available in the specified region. */<br>
> > };<br>
> ><br>
> > While upstream Xen has<br>
> ><br>
> > struct xen_sysctl_availheap {<br>
> >    /* IN variables. */<br>
> >    uint32_t min_bitwidth;  /* Smallest address width (zero if don't care).<br>
> > */<br>
> >    uint32_t max_bitwidth;  /* Largest address width (zero if don't care).<br>
> > */<br>
> >    int32_t  node;          /* NUMA node of interest (-1 for all nodes). */<br>
> >    /* OUT variables. */<br>
> >    uint64_aligned_t avail_bytes;/* Bytes available in the specified region.<br>
> > */<br>
> > };<br>
> ><br>
> > Notice the 'avail_bytes' field is now aligned, so its 4 bytes further<br>
> > down from where libvirt is expecting it to be.<br>
> ><br>
> > We'll have to provide a fix in libvirt to use the new alignment for<br>
> > newer Xen.<br>
<br>
</div><div><div></div><div class="h5">Daniel<br>
--<br>
|: Red Hat, Engineering, London   -o-   <a href="http://people.redhat.com/berrange/" target="_blank">http://people.redhat.com/berrange/</a> :|<br>
|: <a href="http://libvirt.org" target="_blank">http://libvirt.org</a>  -o-  <a href="http://virt-manager.org" target="_blank">http://virt-manager.org</a>  -o-  <a href="http://ovirt.org" target="_blank">http://ovirt.org</a> :|<br>

|: <a href="http://autobuild.org" target="_blank">http://autobuild.org</a>       -o-         <a href="http://search.cpan.org/~danberr/" target="_blank">http://search.cpan.org/~danberr/</a> :|<br>
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|<br>
</div></div></blockquote></div><br></div>