[libvirt] [PATCH 23/34] qemu: cpu hotplug: Move loops to qemuDomainSetVcpusFlags

John Ferlan jferlan at redhat.com
Mon Nov 23 20:56:41 UTC 2015



On 11/20/2015 10:22 AM, Peter Krempa wrote:
> qemuDomainHotplugVcpus/qemuDomainHotunplugVcpus are complex enough in
> regards of adding one CPU. Additionally it will be desired to reuse
> those functions later with specific vCPU hotplug.
> 
> Move the loops for adding vCPUs into qemuDomainSetVcpusFlags so that the
> helpers can be made simpler and more straightforward.
> ---
>  src/qemu/qemu_driver.c | 105 ++++++++++++++++++++++---------------------------
>  1 file changed, 48 insertions(+), 57 deletions(-)
> 
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 9011b2d..9f0e3a3 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -4694,10 +4694,9 @@ qemuDomainDelCgroupForThread(virCgroupPtr cgroup,
>  static int
>  qemuDomainHotplugVcpus(virQEMUDriverPtr driver,
>                         virDomainObjPtr vm,
> -                       unsigned int nvcpus)
> +                       unsigned int vcpu)
>  {
>      qemuDomainObjPrivatePtr priv = vm->privateData;
> -    size_t i;
>      int ret = -1;
>      int oldvcpus = virDomainDefGetVCpus(vm->def);
>      int vcpus = oldvcpus;

You could set this to oldvcpus + 1;...

> @@ -4709,13 +4708,10 @@ qemuDomainHotplugVcpus(virQEMUDriverPtr driver,
> 
>      qemuDomainObjEnterMonitor(driver, vm);
> 
> -    for (i = vcpus; i < nvcpus; i++) {
> -        /* Online new CPU */
> -        if (qemuMonitorSetCPU(priv->mon, i, true) < 0)
> -            goto exit_monitor;
> +    if (qemuMonitorSetCPU(priv->mon, vcpu, true) < 0)
> +        goto exit_monitor;
> 
> -        vcpus++;
> -    }
> +    vcpus++;

Thus removing the need for this...  and an Audit message that doesn't
use the same value for oldvcpus and vcpus (although it could before
these changes).

> 
>      /* After hotplugging the CPUs we need to re-detect threads corresponding
>       * to the virtual CPUs. Some older versions don't provide the thread ID
> @@ -4747,37 +4743,34 @@ qemuDomainHotplugVcpus(virQEMUDriverPtr driver,
>                                              &mem_mask, -1) < 0)
>          goto cleanup;
> 
> -    for (i = oldvcpus; i < nvcpus; i++) {
> -        if (priv->cgroup) {
> -            cgroup_vcpu =
> -                qemuDomainAddCgroupForThread(priv->cgroup,
> -                                             VIR_CGROUP_THREAD_VCPU,
> -                                             i, mem_mask,
> -                                             cpupids[i]);
> -            if (!cgroup_vcpu)
> -                goto cleanup;
> -        }
> +    if (priv->cgroup) {
> +        cgroup_vcpu =
> +            qemuDomainAddCgroupForThread(priv->cgroup,
> +                                         VIR_CGROUP_THREAD_VCPU,
> +                                         vcpu, mem_mask,
> +                                         cpupids[vcpu]);
> +        if (!cgroup_vcpu)
> +            goto cleanup;
> +    }
> 
> -        /* Inherit def->cpuset */
> -        if (vm->def->cpumask) {
> -            if (qemuDomainHotplugAddPin(vm->def->cpumask, i,
> -                                        &vm->def->cputune.vcpupin,
> -                                        &vm->def->cputune.nvcpupin) < 0) {
> -                goto cleanup;
> -            }
> -            if (qemuDomainHotplugPinThread(vm->def->cpumask, i, cpupids[i],
> -                                           cgroup_vcpu) < 0) {
> -                goto cleanup;
> -            }
> +    /* Inherit def->cpuset */
> +    if (vm->def->cpumask) {
> +        if (qemuDomainHotplugAddPin(vm->def->cpumask, vcpu,
> +                                    &vm->def->cputune.vcpupin,
> +                                    &vm->def->cputune.nvcpupin) < 0) {
> +            goto cleanup;
>          }
> -        virCgroupFree(&cgroup_vcpu);

Ahhh.. finally ;-)

> -
> -        if (qemuProcessSetSchedParams(i, cpupids[i],
> -                                      vm->def->cputune.nvcpusched,
> -                                      vm->def->cputune.vcpusched) < 0)
> +        if (qemuDomainHotplugPinThread(vm->def->cpumask, vcpu, cpupids[vcpu],
> +                                       cgroup_vcpu) < 0) {
>              goto cleanup;
> +        }
>      }
> 
> +    if (qemuProcessSetSchedParams(vcpu, cpupids[vcpu],
> +                                  vm->def->cputune.nvcpusched,
> +                                  vm->def->cputune.vcpusched) < 0)
> +        goto cleanup;
> +
>      priv->nvcpupids = ncpupids;
>      VIR_FREE(priv->vcpupids);
>      priv->vcpupids = cpupids;
> @@ -4791,7 +4784,7 @@ qemuDomainHotplugVcpus(virQEMUDriverPtr driver,
>      if (virDomainObjIsActive(vm) &&
>          virDomainDefSetVCpus(vm->def, vcpus) < 0)
>          ret = -1;
> -    virDomainAuditVcpu(vm, oldvcpus, nvcpus, "update", ret == 0);
> +    virDomainAuditVcpu(vm, oldvcpus, vcpus, "update", ret == 0);
>      if (cgroup_vcpu)
>          virCgroupFree(&cgroup_vcpu);
>      return ret;
> @@ -4805,10 +4798,9 @@ qemuDomainHotplugVcpus(virQEMUDriverPtr driver,
>  static int
>  qemuDomainHotunplugVcpus(virQEMUDriverPtr driver,
>                           virDomainObjPtr vm,
> -                         unsigned int nvcpus)
> +                         unsigned int vcpu)
>  {
>      qemuDomainObjPrivatePtr priv = vm->privateData;
> -    size_t i;
>      int ret = -1;
>      int oldvcpus = virDomainDefGetVCpus(vm->def);
>      int vcpus = oldvcpus;

Same as Hotplug, but in reverse... oldvcpus - 1;

> @@ -4817,13 +4809,10 @@ qemuDomainHotunplugVcpus(virQEMUDriverPtr driver,
> 
>      qemuDomainObjEnterMonitor(driver, vm);
> 
> -    for (i = vcpus - 1; i >= nvcpus; i--) {
> -        /* Offline old CPU */
> -        if (qemuMonitorSetCPU(priv->mon, i, false) < 0)
> -            goto exit_monitor;
> +    if (qemuMonitorSetCPU(priv->mon, vcpu, false) < 0)
> +        goto exit_monitor;
> 
> -        vcpus--;
> -    }
> +    vcpus--;

Removing this...

> 
>      /* After hotplugging the CPUs we need to re-detect threads corresponding
>       * to the virtual CPUs. Some older versions don't provide the thread ID
> @@ -4855,16 +4844,14 @@ qemuDomainHotunplugVcpus(virQEMUDriverPtr driver,
>          goto cleanup;
>      }
> 
> -    for (i = oldvcpus - 1; i >= nvcpus; i--) {
> -        if (qemuDomainDelCgroupForThread(priv->cgroup,
> -                                         VIR_CGROUP_THREAD_VCPU, i) < 0)
> -            goto cleanup;
> +    if (qemuDomainDelCgroupForThread(priv->cgroup,
> +                                     VIR_CGROUP_THREAD_VCPU, vcpu) < 0)
> +        goto cleanup;
> 
> -        /* Free vcpupin setting */
> -        virDomainPinDel(&vm->def->cputune.vcpupin,
> -                        &vm->def->cputune.nvcpupin,
> -                        i);
> -    }
> +    /* Free vcpupin setting */
> +    virDomainPinDel(&vm->def->cputune.vcpupin,
> +                    &vm->def->cputune.nvcpupin,
> +                    vcpu);
> 
>      priv->nvcpupids = ncpupids;
>      VIR_FREE(priv->vcpupids);
> @@ -4878,7 +4865,7 @@ qemuDomainHotunplugVcpus(virQEMUDriverPtr driver,
>      if (virDomainObjIsActive(vm) &&
>          virDomainDefSetVCpus(vm->def, vcpus) < 0)
>          ret = -1;
> -    virDomainAuditVcpu(vm, oldvcpus, nvcpus, "update", ret == 0);
> +    virDomainAuditVcpu(vm, oldvcpus, vcpus, "update", ret == 0);
>      return ret;
> 
>   exit_monitor:
> @@ -5021,11 +5008,15 @@ qemuDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
> 
>      if (def) {

Could use

    unsigned int curvcpus = virDomainDefGetVCpus(def);

Although I suppose the compiler will optimize anyway...

>          if (nvcpus > virDomainDefGetVCpus(def)) {
> -            if (qemuDomainHotplugVcpus(driver, vm, nvcpus) < 0)
> -                goto endjob;
> +            for (i = virDomainDefGetVCpus(def); i < nvcpus; i++) {
> +                if (qemuDomainHotplugVcpus(driver, vm, i) < 0)
> +                    goto endjob;
> +            }
>          } else {
> -            if (qemuDomainHotunplugVcpus(driver, vm, nvcpus) < 0)
> -                goto endjob;

Perhaps this is where the comment removed during patch 19 would be
descriptive, e.g. adjust the following to fit here.

-    /* We need different branches here, because we want to offline
-     * in reverse order to onlining, so any partial fail leaves us in a
-     * reasonably sensible state */

ACK - none of the mentioned changes is required, merely suggestions


John

> +            for (i = virDomainDefGetVCpus(def) - 1; i >= nvcpus; i--) {
> +                if (qemuDomainHotunplugVcpus(driver, vm, i) < 0)
> +                    goto endjob;
> +            }
>          }
> 
>          if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm) < 0)
> 




More information about the libvir-list mailing list