[libvirt] [PATCH v3 05/10] Determine whether to start balloon memory stats gathering.

Daniel P. Berrange berrange at redhat.com
Fri Jul 12 13:25:40 UTC 2013


On Fri, Jul 12, 2013 at 09:15:40AM -0400, John Ferlan wrote:
> On 07/12/2013 08:39 AM, Daniel P. Berrange wrote:
> > On Thu, Jul 11, 2013 at 07:55:55PM -0400, John Ferlan wrote:
> >> At vm startup and attach attempt to set the balloon driver statistics
> >> collection period based on the value found in the domain xml file. This
> >> is not done at reconnect since it's possible that a collection period
> >> was set on the live guest and making the set period call would reset to
> >> whatever value is stored in the config file.
> >>
> >> Setting the stats collection period has a side effect of searching through
> >> the qom-list output for the virtio balloon driver and making sure that it
> >> has the right properties in order to allow setting of a collection period
> >> and eventually fetching of statistics.
> >>
> >> The walk through the qom-list is expensive and thus the balloonpath will
> >> be saved in the monitor private structure as well as a flag indicating
> >> that the initialization has already been attempted (in the event that a
> >> path is not found, no sense to keep checking).
> >>
> >> This processing model conforms to the qom object model model which
> >> requires setting object properties after device startup. That is, it's
> >> not possible to pass the period along via the startup code as it won't
> >> be recognized.
> >> ---
> >>  src/qemu/qemu_monitor.c      | 130 +++++++++++++++++++++++++++++++++++++++++++
> >>  src/qemu/qemu_monitor.h      |   2 +
> >>  src/qemu/qemu_monitor_json.c |  24 ++++++++
> >>  src/qemu/qemu_monitor_json.h |   3 +
> >>  src/qemu/qemu_process.c      |  14 ++++-
> >>  5 files changed, 171 insertions(+), 2 deletions(-)
> >>
> >> diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
> >> index 6f9a8fc..a3e250c 100644
> >> --- a/src/qemu/qemu_monitor.c
> >> +++ b/src/qemu/qemu_monitor.c
> >> @@ -83,6 +83,10 @@ struct _qemuMonitor {
> >>  
> >>      /* cache of query-command-line-options results */
> >>      virJSONValuePtr options;
> >> +
> >> +    /* If found, path to the virtio memballoon driver */
> >> +    char *balloonpath;
> >> +    bool ballooninit;
> >>  };
> >>  
> >>  static virClassPtr qemuMonitorClass;
> >> @@ -248,6 +252,7 @@ static void qemuMonitorDispose(void *obj)
> >>      virCondDestroy(&mon->notify);
> >>      VIR_FREE(mon->buffer);
> >>      virJSONValueFree(mon->options);
> >> +    VIR_FREE(mon->balloonpath);
> >>  }
> >>  
> >>  
> >> @@ -925,6 +930,105 @@ qemuMonitorSetOptions(qemuMonitorPtr mon, virJSONValuePtr options)
> >>      mon->options = options;
> >>  }
> >>  
> >> +/* Search the qom objects for the balloon driver object by it's known name
> >> + * of "virtio-balloon-pci".  The entry for the driver will be found in the
> >> + * returned 'type' field using the syntax "child<virtio-balloon-pci>".
> >> + *
> >> + * Once found, check the entry to ensure it has the correct property listed.
> >> + * If it does not, then obtaining statistics from qemu will not be possible.
> >> + * This feature was added to qemu 1.5.
> >> + *
> >> + * This procedure will be call recursively until found or the qom-list is
> >> + * exhausted.
> >> + *
> >> + * Returns:
> >> + *
> >> + *   1  - Found
> >> + *   0  - Not found still looking
> >> + *  -1  - Error bail out
> >> + *
> >> + * NOTE: This assumes we have already called qemuDomainObjEnterMonitor()
> >> + */
> >> +static int
> >> +qemuMonitorFindBalloonObjectPath(qemuMonitorPtr mon,
> >> +                                 virDomainObjPtr vm,
> >> +                                 const char *curpath)
> >> +{
> >> +    size_t i, j, npaths = 0, nprops = 0;
> >> +    int ret = 0;
> >> +    char *nextpath = NULL;
> >> +    qemuMonitorJSONListPathPtr *paths = NULL;
> >> +    qemuMonitorJSONListPathPtr *bprops = NULL;
> >> +
> >> +    /* Already set and won't change or we already search and failed to find */
> >> +    if (mon->balloonpath || mon->ballooninit)
> >> +        return 1;
> > 
> > This isn't correct logic. You need
> > 
> >    if (mon->balloonpath) {
> >      return 1;
> >    } else if (mon->ballooninit) {
> >       virReportError(VIR_ERR_INTERNAL_ERROR, "%s"
> >                      _("Cannot determine balloon device path"));
> >       return -1;
> >    }
> > 
> 
> This is a recursive function - setting ballooninit in here means I have
> to know when I'm back at the first call. That's why it's set in the
> callers.  Since ballooninit means I've either made the call and was
> successful or I've made the call and wasn't successful.
> 
> I think an argument could be made that the checking of balloonpath
> probably is extraneous.
> 
> Since the balloon driver stats are only supported in qemu 1.5 and
> beyond, do we really want an error message?
> 
> >> +
> >> +    /* Not supported */
> >> +    if (!vm->def->memballoon ||
> >> +        vm->def->memballoon->model != VIR_DOMAIN_MEMBALLOON_MODEL_VIRTIO) {
> >> +        VIR_DEBUG("Model must be virtio to get memballoon path");
> > 
> > You need to use virReportError here, so the caller sees an error
> > messages.
> > 
> 
> hmm...  Do we really want to virReportError() in either case?  They're
> not necessarily specifically asking for the statistics here... Although
> with your suggestion to only call SetMemoryStatsPeriod if the period is
> defined, I do see the point.  Although the first time someone does a
> 'virsh dommemstats domain' they'd see this message and perhaps wonder.
> Also if the user didn't have the balloon driver configured, then this
> would be spit out.

The scenario is that an application invokes virDomainSetMemoryStatsPeriod().
This calls qemuMonitorFindBalloonObjectPath(). If that returns -1, then
virDomainSetMemoryStatsPeriod will return -1. For any function that returns
a -1 error condition it is mandatory to have called 'virReportError',
otherwise the caller will just see "unknown error occurred".

Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list