[libvirt] [PATCH v2 18/21] qemu: vcpu: Aggregate code to set vCPU tuning

Ján Tomko jtomko at redhat.com
Wed Feb 3 07:31:10 UTC 2016


On Fri, Jan 29, 2016 at 05:02:13PM +0100, Peter Krempa wrote:
> Rather than iterating 3 times for various settings this function
> aggregates all the code into single place. One of the other advantages
> is that it can then be reused for properly setting vCPU info on hotplug.

It would be also nice to mention that the autoCpuset is now also used
for affinity.

> ---
>  src/qemu/qemu_cgroup.c  |  95 ---------------------
>  src/qemu/qemu_cgroup.h  |   1 -
>  src/qemu/qemu_process.c | 216 +++++++++++++++++++++++++++++++++---------------
>  src/qemu/qemu_process.h |   4 +
>  4 files changed, 152 insertions(+), 164 deletions(-)

> @@ -4464,6 +4402,152 @@ qemuProcessInit(virQEMUDriverPtr driver,
> 
> 
>  /**
> + * qemuProcessSetupVcpu:
> + * @vm: domain object
> + * @vcpuid: id of VCPU to set defaults
> + *
> + * This function sets resource properities (affinity, cgroups, scheduler) for a
> + * vCPU. This function expects that the vCPU is online and the vCPU pids were
> + * correctly detected at the point when it's called.
> + *
> + * Returns 0 on success, -1 on error.
> + */
> +int
> +qemuProcessSetupVcpu(virDomainObjPtr vm,
> +                     unsigned int vcpuid)
> +{
> +    pid_t vcpupid = qemuDomainGetVcpuPid(vm, vcpuid);
> +    virDomainVcpuInfoPtr vcpu = virDomainDefGetVcpu(vm->def, vcpuid);
> +    qemuDomainObjPrivatePtr priv = vm->privateData;
> +    char *mem_mask = NULL;
> +    virDomainNumatuneMemMode mem_mode;
> +    unsigned long long period = vm->def->cputune.period;
> +    long long quota = vm->def->cputune.quota;
> +    virCgroupPtr cgroup_vcpu = NULL;
> +    virBitmapPtr cpumask;
> +    int ret = -1;
> +
> +    if (period || quota) {
> +        if (virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPU)) {

The condition should be negated, as noted by John in his review of v1.

> +            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> +                           _("cgroup cpu is required for scheduler tuning"));
> +            goto cleanup;
> +        }
> +    }
> +
> +    if (virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPU) ||
> +        virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUSET)) {
> +
> +        if (virDomainNumatuneGetMode(vm->def->numa, -1, &mem_mode) == 0 &&
> +            mem_mode == VIR_DOMAIN_NUMATUNE_MEM_STRICT &&
> +            virDomainNumatuneMaybeFormatNodeset(vm->def->numa,
> +                                                priv->autoNodeset,
> +                                                &mem_mask, -1) < 0)
> +            goto cleanup;
> +
> +        if (virCgroupNewThread(priv->cgroup, VIR_CGROUP_THREAD_VCPU, vcpuid,
> +                               true, &cgroup_vcpu) < 0)
> +            goto cleanup;
> +
> +        if (period || quota) {
> +            if (qemuSetupCgroupVcpuBW(cgroup_vcpu, period, quota) < 0)
> +                goto cleanup;
> +        }
> +    }
> +
> +    /* infer which cpumask shall be used */
> +    if (vcpu->cpumask)
> +        cpumask = vcpu->cpumask;
> +    else if (vm->def->placement_mode == VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO)
> +        cpumask = priv->autoCpuset;
> +    else
> +        cpumask = vm->def->cpumask;
> +
> +    if (cpumask) {
> +        /* setup legacy affinty */
> +        if (virProcessSetAffinity(vcpupid, cpumask) < 0)
> +            goto cleanup;
> +

Previously we set up cgroups before setting the affinity.
This patch should preserve that order.

> +        /* setup  cgroups */

Extra space.

ACK with the fixes.

Jan
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20160203/09b069ca/attachment-0001.sig>


More information about the libvir-list mailing list