[libvirt] [PATCH] openvz: add network interface stats

Guido Günther agx at sigxcpu.org
Mon Apr 23 19:43:23 UTC 2012


On Fri, Apr 20, 2012 at 12:01:51PM -0400, Laine Stump wrote:
> On 04/19/2012 06:32 PM, Guido Günther wrote:
> > This will only work for veth devices since venet devices don't have
> > a target element.
> 
> 
> Well, there is precedent for having stats work on some types of
> interfaces and not on others - type='user' interfaces in qemu also don't
> get stats (as the gnome-boxes guys found out, much to their
> disappointment). (Anyway, my point is that this shouldn't stop us from
> enabling stats for those interfaces we *can* support :-)
> 
> 
> > ---
> >  src/openvz/openvz_driver.c |   52 ++++++++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 52 insertions(+)
> >
> > diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c
> > index 7ec327d..e8b6915 100644
> > --- a/src/openvz/openvz_driver.c
> > +++ b/src/openvz/openvz_driver.c
> > @@ -57,6 +57,7 @@
> >  #include "logging.h"
> >  #include "command.h"
> >  #include "viruri.h"
> > +#include "stats_linux.h"
> >  
> >  #define VIR_FROM_THIS VIR_FROM_OPENVZ
> >  
> > @@ -1672,6 +1673,56 @@ cleanup:
> >      return ret;
> >  }
> >  
> > +static int
> > +openvzDomainInterfaceStats (virDomainPtr dom,
> > +                            const char *path,
> > +                            struct _virDomainInterfaceStats *stats)
> > +{
> > +    struct openvz_driver *driver = dom->conn->privateData;
> > +    virDomainObjPtr vm;
> > +    int i;
> > +    int ret = -1;
> > +
> > +    openvzDriverLock(driver);
> > +    vm = virDomainFindByUUID(&driver->domains, dom->uuid);
> > +    openvzDriverUnlock(driver);
> > +
> > +    if (!vm) {
> > +        char uuidstr[VIR_UUID_STRING_BUFLEN];
> > +        virUUIDFormat(dom->uuid, uuidstr);
> > +        openvzError(VIR_ERR_NO_DOMAIN,
> > +                    _("no domain with matching uuid '%s'"), uuidstr);
> > +        goto cleanup;
> > +    }
> > +
> > +    if (!virDomainObjIsActive(vm)) {
> > +        openvzError(VIR_ERR_OPERATION_INVALID,
> > +                    "%s", _("domain is not running"));
> > +        goto cleanup;
> > +    }
> > +
> > +    /* Check the path is one of the domain's network interfaces. */
> > +    for (i = 0 ; i < vm->def->nnets ; i++) {
> > +        if (vm->def->nets[i]->ifname &&
> > +            STREQ (vm->def->nets[i]->ifname, path)) {
> > +            ret = 0;
> > +            break;
> > +        }
> > +    }
> > +
> > +    if (ret == 0)
> > +        ret = linuxDomainInterfaceStats(path, stats);
> > +    else
> > +        openvzError(VIR_ERR_INVALID_ARG,
> > +                    _("invalid path, '%s' is not a known interface"), path);
> > +
> > +cleanup:
> > +    if (vm)
> > +        virDomainObjUnlock(vm);
> > +    return ret;
> > +}
> > +
> > +
> >  static virDriver openvzDriver = {
> >      .no = VIR_DRV_OPENVZ,
> >      .name = "OPENVZ",
> > @@ -1717,6 +1768,7 @@ static virDriver openvzDriver = {
> >      .domainUndefineFlags = openvzDomainUndefineFlags, /* 0.9.4 */
> >      .domainGetAutostart = openvzDomainGetAutostart, /* 0.4.6 */
> >      .domainSetAutostart = openvzDomainSetAutostart, /* 0.4.6 */
> > +    .domainInterfaceStats = openvzDomainInterfaceStats, /* 0.9.12 */
> >      .isEncrypted = openvzIsEncrypted, /* 0.7.3 */
> >      .isSecure = openvzIsSecure, /* 0.7.3 */
> >      .domainIsActive = openvzDomainIsActive, /* 0.7.3 */
> 
> ACK. This is pretty much verbatim what is in qemuDomainInterfaceStats,
> and they're both operating on a host-side veth/tap.
Pushed. Thanks,
 -- Guido




More information about the libvir-list mailing list