[libvirt] [PATCH 31/34] qemu: Replace checking for vcpu<->pid mapping availability with a helper

John Ferlan jferlan at redhat.com
Mon Nov 23 23:19:18 UTC 2015



On 11/20/2015 10:22 AM, Peter Krempa wrote:
> Add qemuDomainHasVCpuPids to do the checking and replace in place checks
> with it.
> ---
>  src/qemu/qemu_cgroup.c  |  7 ++-----
>  src/qemu/qemu_domain.c  | 15 +++++++++++++++
>  src/qemu/qemu_domain.h  |  2 ++
>  src/qemu/qemu_driver.c  | 29 +++++++++++++----------------
>  src/qemu/qemu_process.c |  7 ++++---
>  5 files changed, 36 insertions(+), 24 deletions(-)
> 

Well I got close - reached critical mass here.

> diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c
> index 3c7694a..56c2e90 100644
> --- a/src/qemu/qemu_cgroup.c
> +++ b/src/qemu/qemu_cgroup.c
> @@ -1005,12 +1005,9 @@ qemuSetupCgroupForVcpu(virDomainObjPtr vm)
>          !virCgroupHasController(priv->cgroup, VIR_CGROUP_CONTROLLER_CPUSET))
>          return 0;
> 
> -    if (priv->nvcpupids == 0 || priv->vcpupids[0] == vm->pid) {
> -        /* If we don't know VCPU<->PID mapping or all vcpu runs in the same
> -         * thread, we cannot control each vcpu.
> -         */


I'm curious about the vcpupids[0] == vm->pid checks... I feel like I
missed some nuance with the last patch. Perhaps a bit more explanation
with regard to what happened will help. What up to this point so far
including this patch allows the "safe" removal of that check


> +    /* If vCPU<->pid mapping is missing we can't do vCPU pinning */
> +    if (!qemuDomainHasVCpuPids(vm))
>          return 0;
> -    }
> 
>      if (virDomainNumatuneGetMode(vm->def->numa, -1, &mem_mode) == 0 &&
>          mem_mode == VIR_DOMAIN_NUMATUNE_MEM_STRICT &&
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index 4913a3b..8a45825 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -3956,3 +3956,18 @@ qemuDomainRequiresMlock(virDomainDefPtr def)
> 
>      return false;
>  }
> +
> +
> +/**
> + * qemuDomainHasVCpuPids:
> + * @vm: Domain object
> + *
> + * Returns true if we were able to successfully detect vCPU pids for the VM.
> + */
> +bool
> +qemuDomainHasVCpuPids(virDomainObjPtr vm)

Use of "Vcpu" or "VCPU" rather than "VCpu"

> +{
> +    qemuDomainObjPrivatePtr priv = vm->privateData;
> +
> +    return priv->nvcpupids > 0;
> +}
> diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
> index 03cf6ef..7f2eca1 100644
> --- a/src/qemu/qemu_domain.h
> +++ b/src/qemu/qemu_domain.h
> @@ -491,4 +491,6 @@ int qemuDomainDefValidateMemoryHotplug(const virDomainDef *def,
>                                         virQEMUCapsPtr qemuCaps,
>                                         const virDomainMemoryDef *mem);
> 
> +bool qemuDomainHasVCpuPids(virDomainObjPtr vm);
> +
>  #endif /* __QEMU_DOMAIN_H__ */
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 8047d36..4b7452c 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -1428,7 +1428,7 @@ qemuDomainHelperGetVcpus(virDomainObjPtr vm, virVcpuInfoPtr info, int maxinfo,
>      size_t i, v;
>      qemuDomainObjPrivatePtr priv = vm->privateData;
> 
> -    if (priv->vcpupids == NULL) {
> +    if (!qemuDomainHasVCpuPids(vm)) {
>          virReportError(VIR_ERR_OPERATION_INVALID,
>                         "%s", _("cpu affinity is not supported"));
>          return -1;
> @@ -5118,7 +5118,7 @@ qemuDomainPinVcpuFlags(virDomainPtr dom,
>      }
> 
>      if (def) {
> -        if (priv->vcpupids == NULL) {
> +        if (!qemuDomainHasVCpuPids(vm)) {
>              virReportError(VIR_ERR_OPERATION_INVALID,
>                             "%s", _("cpu affinity is not supported"));
>              goto endjob;
> @@ -10287,21 +10287,18 @@ qemuSetVcpusBWLive(virDomainObjPtr vm, virCgroupPtr cgroup,
>      if (period == 0 && quota == 0)
>          return 0;
> 
> -    /* If we does not know VCPU<->PID mapping or all vcpu runs in the same
> -     * thread, we cannot control each vcpu. So we only modify cpu bandwidth
> -     * when each vcpu has a separated thread.
> -     */
> -    if (priv->nvcpupids != 0 && priv->vcpupids[0] != vm->pid) {
> -        for (i = 0; i < priv->nvcpupids; i++) {
> -            if (virCgroupNewThread(cgroup, VIR_CGROUP_THREAD_VCPU, i,
> -                                   false, &cgroup_vcpu) < 0)
> -                goto cleanup;
> +    if (!qemuDomainHasVCpuPids(vm))
> +        return 0;

Here again the vcpupids[0] thing.

John
> 
> -            if (qemuSetupCgroupVcpuBW(cgroup_vcpu, period, quota) < 0)
> -                goto cleanup;
> +    for (i = 0; i < priv->nvcpupids; i++) {
> +        if (virCgroupNewThread(cgroup, VIR_CGROUP_THREAD_VCPU, i,
> +                               false, &cgroup_vcpu) < 0)
> +            goto cleanup;
> 
> -            virCgroupFree(&cgroup_vcpu);
> -        }
> +        if (qemuSetupCgroupVcpuBW(cgroup_vcpu, period, quota) < 0)
> +            goto cleanup;
> +
> +        virCgroupFree(&cgroup_vcpu);
>      }
> 
>      return 0;
> @@ -10604,7 +10601,7 @@ qemuGetVcpusBWLive(virDomainObjPtr vm,
>      int ret = -1;
> 
>      priv = vm->privateData;
> -    if (priv->nvcpupids == 0 || priv->vcpupids[0] == vm->pid) {
> +    if (!qemuDomainHasVCpuPids(vm)) {
>          /* We do not create sub dir for each vcpu */
>          rc = qemuGetVcpuBWLive(priv->cgroup, period, quota);
>          if (rc < 0)
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index 721647f..d7f45b3 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -2291,12 +2291,13 @@ qemuProcessSetVcpuAffinities(virDomainObjPtr vm)
>      virDomainPinDefPtr pininfo;
>      int n;
>      int ret = -1;
> -    VIR_DEBUG("Setting affinity on CPUs nvcpupin=%zu nvcpus=%d nvcpupids=%d",
> -              def->cputune.nvcpupin, virDomainDefGetVCpus(def), priv->nvcpupids);
> +    VIR_DEBUG("Setting affinity on CPUs nvcpupin=%zu nvcpus=%d hasVcpupids=%d",
> +              def->cputune.nvcpupin, virDomainDefGetVCpus(def),
> +              qemuDomainHasVCpuPids(vm));
>      if (!def->cputune.nvcpupin)
>          return 0;
> 
> -    if (priv->vcpupids == NULL) {
> +    if (!qemuDomainHasVCpuPids(vm)) {
>          /* If any CPU has custom affinity that differs from the
>           * VM default affinity, we must reject it
>           */
> 




More information about the libvir-list mailing list