[libvirt] [PATCH 1/6] domMemStats: Add domainMemoryStats method to struct _virDriver

Adam Litke agl at us.ibm.com
Thu Dec 17 20:38:03 UTC 2009


On Thu, 2009-12-17 at 10:43 +0000, Daniel P. Berrange wrote:
> On Fri, Dec 11, 2009 at 03:26:12PM -0500, Adam Litke wrote:
> > Set up the types for the domainMemoryStats function and insert it into the
> >  
> > +/**
> > + * Memory Statistics Tags:
> > + */
> > +typedef enum {
> > +    /* The total amount of data read from swap space (in bytes). */
> > +    VIR_MEMSTAT_SWAP_IN         = 0,
> > +    /* The total amount of memory written out to swap space (in bytes). */
> > +    VIR_MEMSTAT_SWAP_OUT        = 1,
> > +
> > +    /*
> > +     * Page faults occur when a process makes a valid access to virtual memory
> > +     * that is not available.  When servicing the page fault, if disk IO is
> > +     * required, it is considered a major fault.  If not, it is a minor fault.
> > +     * These are expressed as the number of faults that have occurred.
> > +     */
> > +    VIR_MEMSTAT_MAJOR_FAULT     = 2,
> > +    VIR_MEMSTAT_MINOR_FAULT     = 3,
> > +
> > +    /*
> > +     * The amount of memory left completely unused by the system.  Memory that
> > +     * is available but used for reclaimable caches should NOT be reported as
> > +     * free.  This value is expressed in bytes.
> > +     */
> > +    VIR_MEMSTAT_MEM_FREE        = 4,
> > +
> > +    /*
> > +     * The total amount of usable memory as seen by the domain.  This value
> > +     * may be less than the amount of memory assigned to the domain if a
> > +     * balloon driver is in use or if the guest OS does not initialize all
> > +     * assigned pages.  This value is expressed in bytes.
> > +     */
> > +    VIR_MEMSTAT_MEM_TOTAL       = 5,
> > +
> > +    /*
> > +     * The number of statistics supported by this version of the interface.
> > +     * To add new statistics, add them to the enum and increase this value.
> > +     */
> > +    VIR_MEMSTAT_NR_TAGS         = 6,
> > +} virDomainMemoryStatTags;
> 
> I'm a little wary of this last element 'VIR_MEMSTAT_NR_TAGS', since 
> it is something that will obviously change as we add more stats. I
> see your intent is that the caller simply statically declare an array
> that is VIR_MEMSTAT_NR_TAGS  in size. The only other alternative I see
> is to have an API for querying the number of supported statistics, but
> then that has the downside of requiring an extra API call (network
> round trip) for something we expect to be called quite frequently.

Yep, this dilemma is apparent to me as well.  I think the only two
alternatives are: a query API (as you mention above), or going back to a
static stats structure.  I agree that forcing two separate calls for
each operation would be unfortunate.  And if we revert to using a static
stats structure, we just end up creating churn in that definition (while
introducing a new set of problems).  So, it seems that
VIR_MEMSTAT_NR_TAGS is the least offensive way to solve the problem.
Would it help to rename it to something else (eg. VIR_MEMSTAT_NR_STATS)?

> > +
> > +typedef struct _virDomainMemoryStat virDomainMemoryStatStruct;
> > +
> > +struct _virDomainMemoryStat {
> > +    virDomainMemoryStatTags tag;
> 
> This should be an 'int', since enums have an ill-defined size for ABI

Ok.

-- 
Thanks,
Adam




More information about the libvir-list mailing list