[Libvir] RFC PATCH - Initial NodeGetCellsFreeMemory patch

Daniel Veillard veillard at redhat.com
Fri Sep 21 16:23:25 UTC 2007


On Fri, Sep 21, 2007 at 10:59:01AM -0400, beth kon wrote:
> oops... meant to post to list as well
> beth kon wrote:
> 

  and my reply, I didn't realized it was off-list :-)

On Fri, Sep 21, 2007 at 09:44:36AM -0400, beth kon wrote:
> Daniel Veillard wrote:
> 
> >On Thu, Sep 20, 2007 at 05:10:49PM -0400, beth kon wrote:
> > 
> >
> >>Here is my first pass at a patch for accessing the available memory 
> >>associated with each NUMA cell through libvirt.
> >>   
> >>
> >
> > Thanks !
> > 
> >
> Thanks for the quick comments!
> 
> >>+struct xen_v2s4_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). */
> >>   
> >>
> >
> > I'm a bit puzzled by those 2 fields I still wonder what it is about :-)
> >
> > 
> >
> I was puzzled too! These fields are related to the case when 32 bit 
> guests need to reserve certain ranges of memory for DMA, for example. I 
> checked with Ryan and he assured me we don't need to worry about those 
> fields for these purposes.

  ah, okay

> >>+    int32_t  node;          /* NUMA node (-1 for sum across all nodes). 
> >>*/
> >>+    uint64_t avail_bytes;   /* Bytes available in the specified region. 
> >>*/
> >>+};
> >>+
> >>+typedef struct xen_v2s4_availheap  xen_v2s4_availheap;
> >>+
> >>   
> >>
> >[...]
> > 
> >
> What does [...] mean? :-)

  that I deleted some of the original input from your mail there :-)

> > 
> >
> >>+xenHypervisorNodeGetCellsFreeMemory(virConnectPtr conn, long long 
> >>*freeMems,
> >>+                                    int startCell, int maxCells)
> >>{
> >>-    if ((conn == NULL) || (freeMems == NULL) || (nbCells < 0))
> >>-        return -1;
> >>+    xen_op_v2_sys op_sys;
> >>+    int i, ret, nbCells;
> >>+    virNodeInfo nodeInfo;
> >>+    virNodeInfoPtr nodeInfoPtr = &nodeInfo;
> >>+    xenUnifiedPrivatePtr priv;
> >>+    
> >>
> >>+    if ((conn == NULL) || (freeMems == NULL) || (maxCells < 0))
> >>+        return -1;
> >>   
> >>
> >
> > Hum, actually, that would catch the (maxCells == -1) so that won't work
> >and won't catch maxCells == 0 which could lead to a segfault. Maybe
> >(maxCells == 0) || (maxCells < -1) should be used instead.
> >
> > 
> >
> Yes, you're right. I added maxcells = -1 and startCell as an 
> afterthought, and it shows!

  okay

> >>+    /* get actual number of cells */
> >>+    if (xenDaemonNodeGetInfo(conn, nodeInfoPtr)) {
> >>   
> >>
> >
> > Hum, since the number of cells is static, maybe this should be stored
> >permanently in a variable on init. The xenDaemon RPC will be orders of 
> >magnitude
> >more expensive than the direct hypercall below.
> >
> > 
> >
> >>+        virXenError(VIR_ERR_XEN_CALL, " cannot determine actual number 
> >>of cells", 0);
> >>+        return -1;
> >>+    }
> >>+    nbCells = nodeInfoPtr->nodes;
> >>+
> >>+    if (maxCells > nbCells)
> >>+        maxCells = nbCells;
> >>   
> >>
> >
> > 
> >
> I wondered about that. Would you like me to make that change as part of 
> this patch?

  yes if you feel it's not too much to add, sure !

> >  Hum ... maxCells is the number of entries in the array, I'm afraid you 
> >  will
> >need 2 counters or I misunderstood the way the API works (possible :-),
> >I would fill in freeMems[] starting at index 0 for startCell, and going up.
> >That feels more coherent than leaving uninitialized values at the start of
> >the array:
> >
> >      for (i = startCell, j = 0;(i < nbCells) && (j < maxCells);i++,j++) {
> >          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;
> >      }
> >      return (j);
> >
> > 
> >
> Yes, right again!

  Ah, okay :-) I was wondering if I had misunderstood instead !

    thanks,

Daniel

-- 
Red Hat Virtualization group http://redhat.com/virtualization/
Daniel Veillard      | virtualization library  http://libvirt.org/
veillard at redhat.com  | libxml GNOME XML XSLT toolkit  http://xmlsoft.org/
http://veillard.com/ | Rpmfind RPM search engine  http://rpmfind.net/




More information about the libvir-list mailing list