[libvirt] getFreeMemory reporting incorrectly?

Daniel Veillard veillard at redhat.com
Mon Jun 15 10:09:13 UTC 2009


On Fri, Jun 12, 2009 at 03:44:50PM +0100, Daniel P. Berrange wrote:
> On Thu, Jun 11, 2009 at 02:37:57PM -0400, Hany Fahim wrote:
> > Thanks Daniel,
> > Is it fair to assume this fix may appear in the next release of libvirt?
> 
> If you want to build from source, I'd appreciate feedback on whether
> the following patch fixes the problem
> 
> diff -r f204769dd197 src/xen_internal.c
> --- a/src/xen_internal.c	Wed Jun 03 13:52:06 2009 +0000
> +++ b/src/xen_internal.c	Fri Jun 12 15:44:05 2009 +0100
> @@ -241,6 +241,15 @@ struct xen_v2s4_availheap {
>  
>  typedef struct xen_v2s4_availheap  xen_v2s4_availheap;
>  
> +struct xen_v2s5_availheap {
> +    uint32_t min_bitwidth;  /* Smallest address width (zero if don't care). */
> +    uint32_t max_bitwidth;  /* Largest address width (zero if don't care). */
> +    int32_t  node;          /* NUMA node (-1 for sum across all nodes). */
> +    uint64_t avail_bytes ALIGN_64;   /* Bytes available in the specified region. */
> +};
> +
> +typedef struct xen_v2s5_availheap  xen_v2s5_availheap;
> +
>  
>  #define XEN_GETDOMAININFOLIST_ALLOC(domlist, size)                      \
>      (hypervisor_version < 2 ?                                           \
> @@ -650,6 +659,7 @@ struct xen_op_v2_sys {
>          xen_v2s3_getdomaininfolistop getdomaininfolists3;
>          xen_v2_getschedulerid        getschedulerid;
>          xen_v2s4_availheap           availheap;
> +        xen_v2s5_availheap           availheap5;
>          uint8_t padding[128];
>      } u;
>  };
> @@ -3125,12 +3135,18 @@ xenHypervisorNodeGetCellsFreeMemory(virC
>      op_sys.cmd = XEN_V2_OP_GETAVAILHEAP;
>  
>      for (i = startCell, j = 0;(i < priv->nbNodeCells) && (j < maxCells);i++,j++) {
> -        op_sys.u.availheap.node = i;
> +        if (sys_interface_version >= 5)
> +            op_sys.u.availheap5.node = i;
> +        else
> +            op_sys.u.availheap.node = i;
>          ret = xenHypervisorDoV2Sys(priv->handle, &op_sys);
>          if (ret < 0) {
>              return(-1);
>          }
> -        freeMems[j] = op_sys.u.availheap.avail_bytes;
> +        if (sys_interface_version >= 5)
> +            freeMems[j] = op_sys.u.availheap5.avail_bytes;
> +        else
> +            freeMems[j] = op_sys.u.availheap.avail_bytes;
>      }
>      return (j);
>  }


  Looks fine to me, ACK.
  Just one small worry, did we precisely identify when the change
happened ? In xenHypervisorInit we go directly from sys_interface_version
of 4 to 6, we never try 5 as far as I can see.

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list