[libvirt] [PATCH] qemu: numatune/domiftune no support in session mode

Erik Skultety eskultet at redhat.com
Thu Sep 4 07:16:45 UTC 2014



On 09/03/2014 05:00 PM, Erik Skultety wrote:
> Tuning NUMA or network interface parameters require root
> privileges, thus an attempt to set some of these parameters in
> session mode should be invalid followed by an error. As an example might
> be memory tuning which raises an error in such case. This patch
> provides similar behavior for numatune and domiftune.
> Resolves https://bugzilla.redhat.com/show_bug.cgi?id=1126762
> ---
>   src/qemu/qemu_command.c | 33 ++++++++++++++++++++++++++++++++-
>   src/qemu/qemu_driver.c  | 20 ++++++++++++++++++++
>   2 files changed, 52 insertions(+), 1 deletion(-)
>
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index c84c7c3..c021080 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -7443,7 +7443,7 @@ qemuBuildCommandLine(virConnectPtr conn,
>       emulator = def->emulator;
>
>       if (!cfg->privileged) {
> -        /* If we have no cgroups than we can have no tunings that
> +        /* If we have no cgroups then we can have no tunings that
>            * require them */
>
>           if (def->mem.hard_limit || def->mem.soft_limit ||
> @@ -7466,6 +7466,37 @@ qemuBuildCommandLine(virConnectPtr conn,
>                              _("CPU tuning is not available in session mode"));
>               goto error;
>           }
> +
> +        if (virDomainNumatuneGetNodeset(def->numatune, NULL, -1) ||
> +            virDomainNumatuneGetMode(def->numatune, -1)) {
> +            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> +                           _("NUMA tuning is not available in session mode"));
> +            goto error;
> +        }
> +
> +        virDomainNetDefPtr *nets = def->nets;
> +        size_t nnets = def->nnets;
> +        for (i = 0; i < nnets; i++) {
> +            if (nets[i]->bandwidth) {
> +                if (nets[i]->bandwidth->in &&
> +                    (nets[i]->bandwidth->in->average ||
> +                     nets[i]->bandwidth->in->peak ||
> +                     nets[i]->bandwidth->in->burst)) {
> +                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> +                                   _("Network bandwidth tuning is not available in session mode"));
> +                    goto error;
> +                }
> +
> +                if (nets[i]->bandwidth->out &&
> +                    (nets[i]->bandwidth->out->average ||
> +                     nets[i]->bandwidth->out->peak ||
> +                     nets[i]->bandwidth->out->burst)) {
> +                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> +                                   _("Network bandwidth tuning is not available in session mode"));
> +                    goto error;
> +                }
> +            }
> +        }
>       }

NACK, I forgot to test for struct element 'floor' here. Fixing in v2.
>
>       for (i = 0; i < def->ngraphics; ++i) {
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 239a300..b46e12f 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -8779,6 +8779,12 @@ qemuDomainSetNumaParameters(virDomainPtr dom,
>       if (virDomainSetNumaParametersEnsureACL(dom->conn, vm->def, flags) < 0)
>           goto cleanup;
>
> +    if (!cfg->privileged) {
> +        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
> +                       _("NUMA tuning is not available in session mode"));
> +        goto cleanup;
> +    }
> +
>       if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
>           goto cleanup;
>
> @@ -8870,6 +8876,7 @@ qemuDomainGetNumaParameters(virDomainPtr dom,
>       size_t i;
>       virDomainObjPtr vm = NULL;
>       virDomainDefPtr persistentDef = NULL;
> +    virQEMUDriverConfigPtr cfg = NULL;
>       char *nodeset = NULL;
>       int ret = -1;
>       virCapsPtr caps = NULL;
> @@ -8888,10 +8895,17 @@ qemuDomainGetNumaParameters(virDomainPtr dom,
>           return -1;
>
>       priv = vm->privateData;
> +    cfg = virQEMUDriverGetConfig(driver);
>
>       if (virDomainGetNumaParametersEnsureACL(dom->conn, vm->def) < 0)
>           goto cleanup;
>
> +    if (!cfg->privileged) {
> +        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
> +                       _("NUMA tuning is not available in session mode"));
> +        goto cleanup;
> +    }
> +
>       if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
>           goto cleanup;
>
> @@ -9889,6 +9903,12 @@ qemuDomainSetInterfaceParameters(virDomainPtr dom,
>       if (virDomainSetInterfaceParametersEnsureACL(dom->conn, vm->def, flags) < 0)
>           goto cleanup;
>
> +    if (!cfg->privileged) {
> +        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
> +                       _("Network bandwidth tuning is not available in session mode"));
> +        goto cleanup;
> +    }
> +
>       if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
>           goto cleanup;
>
>
Erik




More information about the libvir-list mailing list