[libvirt] [PATCH 8/9] qemu: Add support for resctrl

John Ferlan jferlan at redhat.com
Thu Jan 4 00:19:00 UTC 2018


Need to beef up this commit message.

On 12/13/2017 10:39 AM, Martin Kletzander wrote:
> Signed-off-by: Martin Kletzander <mkletzan at redhat.com>
> ---
>  src/qemu/qemu_process.c | 61 +++++++++++++++++++++++++++++++++++++++++++++----
>  1 file changed, 56 insertions(+), 5 deletions(-)
> 

Is there anything special that needs to be done at libvirtd restart time?

If hot{plug|unplug} isn't supported if a vcpu has a vcputune defined,
then we probably need to inhibit that.  Otherwise, what needs to be done
to support it?

John

> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index a0f430f89f06..8abd9a5a8da3 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -2507,6 +2507,33 @@ qemuProcessSetupEmulator(virDomainObjPtr vm)
>  }
>  
>  
> +static int
> +qemuProcessResctrlCreate(virQEMUDriverPtr driver,
> +                         virDomainObjPtr vm)
> +{
> +    int ret = -1;
> +    size_t i = 0;
> +    virCapsPtr caps = virQEMUDriverGetCapabilities(driver, false);
> +    qemuDomainObjPrivatePtr priv = vm->privateData;
> +
> +    if (!caps)
> +        return -1;
> +
> +    for (i = 0; i < vm->def->ncachetunes; i++) {
> +        if (virResctrlAllocCreate(caps->host.resctrl,
> +                                  vm->def->cachetunes[i]->alloc,
> +                                  "qemu",
> +                                  priv->machineName) < 0)
> +            goto cleanup;
> +    }
> +
> +    ret = 0;
> + cleanup:
> +    virObjectUnref(caps);
> +    return ret;
> +}
> +
> +
>  static int
>  qemuProcessInitPasswords(virConnectPtr conn,
>                           virQEMUDriverPtr driver,
> @@ -5013,12 +5040,26 @@ qemuProcessSetupVcpu(virDomainObjPtr vm,
>  {
>      pid_t vcpupid = qemuDomainGetVcpuPid(vm, vcpuid);
>      virDomainVcpuDefPtr vcpu = virDomainDefGetVcpu(vm->def, vcpuid);
> +    size_t i = 0;
>  
> -    return qemuProcessSetupPid(vm, vcpupid, VIR_CGROUP_THREAD_VCPU,
> -                               vcpuid, vcpu->cpumask,
> -                               vm->def->cputune.period,
> -                               vm->def->cputune.quota,
> -                               &vcpu->sched);
> +    if (qemuProcessSetupPid(vm, vcpupid, VIR_CGROUP_THREAD_VCPU,
> +                            vcpuid, vcpu->cpumask,
> +                            vm->def->cputune.period,
> +                            vm->def->cputune.quota,
> +                            &vcpu->sched) < 0)
> +        return -1;
> +
> +    for (i = 0; i < vm->def->ncachetunes; i++) {
> +        virDomainCachetuneDefPtr ct = vm->def->cachetunes[i];
> +
> +        if (virBitmapIsBitSet(ct->vcpus, vcpuid)) {
> +            if (virResctrlAllocAddPID(ct->alloc, vcpupid) < 0)
> +                return -1;
> +            break;
> +        }
> +    }
> +
> +    return 0;
>  }
>  
>  
> @@ -5891,6 +5932,10 @@ qemuProcessLaunch(virConnectPtr conn,
>      if (qemuProcessSetupEmulator(vm) < 0)
>          goto cleanup;
>  
> +    VIR_DEBUG("Setting up resctrlfs");
> +    if (qemuProcessResctrlCreate(driver, vm) < 0)
> +        goto cleanup;
> +
>      VIR_DEBUG("Setting domain security labels");
>      if (qemuSecuritySetAllLabel(driver,
>                                  vm,
> @@ -6539,6 +6584,12 @@ void qemuProcessStop(virQEMUDriverPtr driver,
>                   vm->def->name);
>      }
>  
> +    /* Remove resctrl allocation after cgroups are cleaned up which makes it
> +     * kind of safer (although removing the allocation should work even with
> +     * pids in tasks file */
> +    for (i = 0; i < vm->def->ncachetunes; i++)
> +        virResctrlAllocRemove(vm->def->cachetunes[i]->alloc);
> +
>      qemuProcessRemoveDomainStatus(driver, vm);
>  
>      /* Remove VNC and Spice ports from port reservation bitmap, but only if
> 




More information about the libvir-list mailing list