[PATCH Libvirt 04/11] virsh: Introduce limit-dirty-page-rate api

Peter Krempa pkrempa at redhat.com
Mon Jul 31 08:23:45 UTC 2023


On Mon, Aug 08, 2022 at 23:41:27 +0800, ~hyman wrote:
> From: Hyman Huang(黄勇) <yong.huang at smartx.com>
> 
> Introduce limit-dirty-page-rate virsh api to set dirty page
> rate upper limit for virtual CPUs:
> 
> The following is the usage:
> $ virsh limit-dirty-page-rate <domain> <rate> [--vcpu <number>]
> 
> Set the specified index of vcpu if 'vcpu' option is specified,
> set all virtual CPUs of a VM otherwise.
> 
> Signed-off-by: Hyman Huang(黄勇) <yong.huang at smartx.com>
> ---
>  tools/virsh-domain.c | 92 ++++++++++++++++++++++++++++++++++++++++++++

missing addition to docs/manpages/virsh.rst

>  1 file changed, 92 insertions(+)
> 
> diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
> index fb54562eb6..ba2309eb3c 100644
> --- a/tools/virsh-domain.c
> +++ b/tools/virsh-domain.c
> @@ -13817,6 +13817,92 @@ cmdDomDirtyRateCalc(vshControl *ctl, const vshCmd *cmd)
>      return true;
>  }
>  
> +#define IGNORED_CPU_INDEX   -1

Too generic name. Also no need for the definition most likely.

> +
> +/*
> + * "limit-dirty-page-rate" command
> + */
> +static const vshCmdInfo info_limit_dirty_page_rate[] = {
> +    {.name = "help",
> +     .data = N_("Set dirty page rate upper limit")
> +    },
> +    {.name = "desc",
> +     .data = N_("Set dirty page rate upper limit, "
> +                "require dirty-ring size configured")

This limitation is not documented anywhere else.

> +    },
> +    {.name = NULL}
> +};
> +
> +static const vshCmdOptDef opts_limit_dirty_page_rate[] = {
> +    VIRSH_COMMON_OPT_DOMAIN_FULL(0),
> +    {.name = "rate",
> +     .type = VSH_OT_INT,
> +     .flags = VSH_OFLAG_REQ,
> +     .help = N_("Upper limit of dirty page rate (MB/s) for "
> +                "virtual CPUs")
> +    },
> +    {.name = "vcpu",
> +     .type = VSH_OT_INT,
> +     .help = N_("Index of a virtual CPU")
> +    },
> +    {.name = NULL}
> +};
> +
> +static bool
> +cmdLimitDirtyPageRate(vshControl *ctl, const vshCmd *cmd)
> +{
> +    g_autoptr(virshDomain) dom = NULL;
> +    int vcpu_idx = -1;
> +    unsigned long long rate = 0;
> +    bool vcpu = vshCommandOptBool(cmd, "vcpu");
> +    unsigned int flags = 0;
> +
> +    if (!(dom = virshCommandOptDomain(ctl, cmd, NULL)))
> +        return false;
> +
> +    if (vcpu) {
> +        if (vshCommandOptInt(ctl, cmd, "vcpu", &vcpu_idx) < 0)
> +            return false;
> +
> +        if (vcpu_idx < 0) {
> +            vshError(ctl, "%s", _("Invalid vcpu index, using --vcpu "
> +                                  "to specify cpu index"));
> +            return false;
> +        }
> +    }
> +
> +    if (vshCommandOptULongLong(ctl, cmd, "rate", &rate) < 0)
> +        return false;
> +
> +    if (!rate) {

Checks for 0 with integers that can have arbitrary numeric value should
be explicit "if (rate == 0)"...

> +        vshError(ctl, "%s", _("Invalid dirty page rate limit"));
> +        return false;
> +    }
> +
> +    if (vcpu) {
> +        /* set specified vcpu dirty page rate limit of vm */
> +        if (virDomainSetVcpuDirtyLimit(dom, vcpu_idx,
> +                rate, flags | VIR_DOMAIN_DIRTYLIMIT_VCPU) < 0)
> +            return false;
> +        g_autofree char *info =
> +            g_strdup_printf("Set vcpu[%d] dirty page rate upper "
> +                            "limit %lld(MB/s) successfully",
> +                            vcpu_idx, rate);

This is not translatable. Make sure to always construct the message
within vshPRintExtra's second argument which is wrapped with the gettext
macro.

> +        vshPrintExtra(ctl, _("%1$s\n"), info);
> +    } else {
> +        /* set all vcpu dirty page rate limit of vm */
> +        if (virDomainSetVcpuDirtyLimit(dom, IGNORED_CPU_INDEX,
> +                rate, flags | VIR_DOMAIN_DIRTYLIMIT_ALL) < 0)
> +            return false;
> +        g_autofree char *info =
> +            g_strdup_printf("Set dirty page rate limit %lld(MB/s) "
> +                            "on all virtual CPUs successfully",
> +                            rate);

This is not translatable.

> +        vshPrintExtra(ctl, _("%1$s\n"), info);
> +    }
> +
> +    return true;
> +}
>  
>  const vshCmdDef domManagementCmds[] = {
>      {.name = "attach-device",
> @@ -14481,5 +14567,11 @@ const vshCmdDef domManagementCmds[] = {
>       .info = info_dom_fd_associate,
>       .flags = 0
>      },
> +    {.name = "limit-dirty-page-rate",
> +     .handler = cmdLimitDirtyPageRate,
> +     .opts = opts_limit_dirty_page_rate,
> +     .info = info_limit_dirty_page_rate,
> +     .flags = 0
> +    },
>      {.name = NULL}
>  };
> -- 
> 2.38.5
> 


More information about the libvir-list mailing list