[libvirt] [PATCH 8/8] Allow balloon driver collection to be adjusted dynamically

Michal Privoznik mprivozn at redhat.com
Wed Jul 3 12:03:16 UTC 2013


On 02.07.2013 15:39, John Ferlan wrote:
> Extend the virDomainSetMemeoryFlags() to accept a 'VIR_DOMAIN_MEM_PERIOD'
> which will be used to dynamically set the collection period for the balloon
> driver via a 'virsh dommemstat <domain> --period <value>' command.  Add
> the --current, --live, & --config options to dommemstat.
> ---
>  docs/formatdomain.html.in    | 14 +++++++++
>  include/libvirt/libvirt.h.in |  1 +
>  src/libvirt.c                |  8 ++++-
>  src/qemu/qemu_driver.c       | 44 +++++++++++++++++++++++++++-
>  tools/virsh-domain-monitor.c | 70 ++++++++++++++++++++++++++++++++++++++++++--
>  5 files changed, 132 insertions(+), 5 deletions(-)

> diff --git a/tools/virsh-domain-monitor.c b/tools/virsh-domain-monitor.c
> index 3ba829c..f123247 100644
> --- a/tools/virsh-domain-monitor.c
> +++ b/tools/virsh-domain-monitor.c
> @@ -306,6 +306,23 @@ static const vshCmdOptDef opts_dommemstat[] = {
>       .flags = VSH_OFLAG_REQ,
>       .help = N_("domain name, id or uuid")
>      },
> +    {.name = "period",
> +     .type = VSH_OT_DATA,
> +     .flags = VSH_OFLAG_EMPTY_OK,
> +     .help = N_("period in seconds to set collection")
> +    },
> +    {.name = "config",
> +     .type = VSH_OT_BOOL,
> +     .help = N_("affect next boot")
> +    },
> +    {.name = "live",
> +     .type = VSH_OT_BOOL,
> +     .help = N_("affect running domain")
> +    },
> +    {.name = "current",
> +     .type = VSH_OT_BOOL,
> +     .help = N_("affect current domain")
> +    },
>      {.name = NULL}
>  };
>  
> @@ -316,15 +333,60 @@ cmdDomMemStat(vshControl *ctl, const vshCmd *cmd)
>      const char *name;
>      struct _virDomainMemoryStat stats[VIR_DOMAIN_MEMORY_STAT_NR];
>      unsigned int nr_stats, i;
> +    int ret = false;
> +    int rv = 0;
> +    int period = -1;
> +    bool config = vshCommandOptBool(cmd, "config");
> +    bool live = vshCommandOptBool(cmd, "live");
> +    bool current = vshCommandOptBool(cmd, "current");
> +    unsigned int flags = VIR_DOMAIN_AFFECT_CURRENT;
> +
> +    VSH_EXCLUSIVE_OPTIONS_VAR(current, live);
> +    VSH_EXCLUSIVE_OPTIONS_VAR(current, config);
> +    if (config)
> +        flags |= VIR_DOMAIN_AFFECT_CONFIG;
> +    if (live)
> +        flags |= VIR_DOMAIN_AFFECT_LIVE;
>  
>      if (!(dom = vshCommandOptDomain(ctl, cmd, &name)))
>          return false;
>  
> +    /* none of the options were specified - choose defaults based on state */
> +    if (!current && !live && !config) {
> +        if (virDomainIsActive(dom) == 1)
> +            flags |= VIR_DOMAIN_AFFECT_LIVE;
> +        else
> +            flags |= VIR_DOMAIN_AFFECT_CONFIG;

This should not be needed as qemu driver will the proper option for
VIR_DOMAIN_AFFECT_CURRENT. Client can't make such decision as domain is
not locked and may translate into different state.

> +    }
> +
> +    /* Providing a period will adjust the balloon driver collection period.
> +     * This is not really an unsigned long, but it
> +     */
> +    if ((rv = vshCommandOptInt(cmd, "period", &period)) < 0) {
> +        vshError(ctl, "%s",
> +                 _("Unable to parse integer parameter."));
> +        goto cleanup;
> +    }
> +    if (rv > 0) {
> +        if (period < 0) {
> +            vshError(ctl, _("Invalid collection period value '%d'"), period);
> +            goto cleanup;
> +        }
> +
> +        flags |= VIR_DOMAIN_MEM_PERIOD;
> +        if (virDomainSetMemoryFlags(dom, period, flags) < 0) {
> +            vshError(ctl, "%s",
> +                     _("Unable to change balloon collection period."));
> +        } else {
> +            ret = true;
> +        }
> +        goto cleanup;
> +    }
> +
>      nr_stats = virDomainMemoryStats(dom, stats, VIR_DOMAIN_MEMORY_STAT_NR, 0);
>      if (nr_stats == -1) {
>          vshError(ctl, _("Failed to get memory statistics for domain %s"), name);
> -        virDomainFree(dom);
> -        return false;
> +        goto cleanup;
>      }
>  
>      for (i = 0; i < nr_stats; i++) {
> @@ -346,8 +408,10 @@ cmdDomMemStat(vshControl *ctl, const vshCmd *cmd)
>              vshPrint(ctl, "rss %llu\n", stats[i].val);
>      }
>  
> +    ret = true;
> +cleanup:
>      virDomainFree(dom);
> -    return true;
> +    return ret;
>  }
>  
>  /*
> 

Michal




More information about the libvir-list mailing list