[libvirt] [PATCH 5/7] qemu: qemuDomainHotplugVcpus - separate out pin adjustment code

John Ferlan jferlan at redhat.com
Thu Mar 19 18:37:55 UTC 2015



On 03/19/2015 01:08 PM, John Ferlan wrote:
> Impending IOThread setting patches would copy the code anyway, so create
> and generalize the adding of pindef for the vcpu into its own API
> 
> Signed-off-by: John Ferlan <jferlan at redhat.com>
> ---
>  src/qemu/qemu_driver.c | 104 +++++++++++++++++++++++++++++--------------------
>  1 file changed, 62 insertions(+), 42 deletions(-)
> 
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 673b95e..1fca43c 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -4669,6 +4669,63 @@ qemuDomainHotplugAddCgroup(virCgroupPtr cgroup,
>      return NULL;
>  }
>  
> +typedef int cgroupSetupFunc(virCgroupPtr cgroup,
> +                            virDomainPinDefPtr *pindef,
> +                            int npin,
> +                            int id);
> +
> +static int
> +qemuDomainHotplugAddPin(virBitmapPtr cpumask,
> +                        int index,
> +                        pid_t pid,
> +                        virDomainPinDefPtr **pindef_list,
> +                        size_t *npin,
> +                        cgroupSetupFunc func,
> +                        virCgroupPtr cgroup)
> +{
> +    int ret = -1;
> +    virDomainPinDefPtr pindef = NULL;
> +
> +    /* vm->def->cputune.* arrays can't be NULL if
> +     * vm->def->cpumask is not NULL.
> +     */
> +    if (VIR_ALLOC(pindef) < 0)
> +        goto cleanup;
> +
> +    if (!(pindef->cpumask = virBitmapNew(VIR_DOMAIN_CPUMASK_LEN))) {
> +        VIR_FREE(pindef);
> +        goto cleanup;
> +    }
> +    virBitmapCopy(pindef->cpumask, cpumask);
> +    pindef->id = index;
> +    if (VIR_APPEND_ELEMENT_COPY(*pindef_list, *npin, pindef) < 0) {
> +        virBitmapFree(pindef->cpumask);
> +        VIR_FREE(pindef);
> +        goto cleanup;
> +    }
> +
> +    if (cgroup) {
> +        if (func(cgroup, *pindef_list, *npin, index) < 0) {
> +            virReportError(VIR_ERR_OPERATION_INVALID,
> +                           _("failed to set cpuset.cpus in cgroup for id %d"),
> +                           index);
> +            goto cleanup;
> +        }
> +    } else {
> +        if (virProcessSetAffinity(pid, pindef->cpumask) < 0) {
> +            virReportError(VIR_ERR_SYSTEM_ERROR,
> +                           _("failed to set cpu affinity for id %d"),
> +                           index);
> +            goto cleanup;
> +        }
> +    }
> +
> +    ret = 0;
> +
> + cleanup:
> +    return ret;
> +}
> +
>  static int
>  qemuDomainHotplugDelCgroupPin(virCgroupPtr cgroup,
>                                cgroupNewFunc func,
> @@ -4795,51 +4852,14 @@ qemuDomainHotplugVcpus(virQEMUDriverPtr driver,
>  
>              /* Inherit def->cpuset */
>              if (vm->def->cpumask) {
> -                /* vm->def->cputune.vcpupin can't be NULL if
> -                 * vm->def->cpumask is not NULL.
> -                 */
> -                virDomainPinDefPtr vcpupin = NULL;
> -
> -                if (VIR_ALLOC(vcpupin) < 0)
> -                    goto cleanup;
> -
> -                if (!(vcpupin->cpumask =
> -                      virBitmapNew(VIR_DOMAIN_CPUMASK_LEN))) {
> -                    VIR_FREE(vcpupin);
> -                    goto cleanup;
> -                }
> -                virBitmapCopy(vcpupin->cpumask, vm->def->cpumask);
> -                vcpupin->id = i;
> -                if (VIR_APPEND_ELEMENT_COPY(vm->def->cputune.vcpupin,
> -                                            vm->def->cputune.nvcpupin, vcpupin) < 0) {
> -                    virBitmapFree(vcpupin->cpumask);
> -                    VIR_FREE(vcpupin);
> +                if (qemuDomainHotplugAddPin(vm->def->cpumask, i, cpupids[i],
> +                                            &vm->def->cputune.vcpupin,
> +                                            &vm->def->cputune.nvcpupin,
> +                                            qemuSetupCgroupVcpuPin,
> +                                            cgroup_vcpu) < 0)
>                      ret = -1;
>                      goto cleanup;

Ran my changes againt Coverity - looks like I missed something right
here - consider the following squashed in:

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 1fca43c..496a4af 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -4856,9 +4856,10 @@ qemuDomainHotplugVcpus(virQEMUDriverPtr driver,
                                             &vm->def->cputune.vcpupin,
                                             &vm->def->cputune.nvcpupin,
                                             qemuSetupCgroupVcpuPin,
-                                            cgroup_vcpu) < 0)
+                                            cgroup_vcpu) < 0) {
                     ret = -1;
                     goto cleanup;
+                }
             }
             virCgroupFree(&cgroup_vcpu);




> -                }
> -
> -                if (cgroup_vcpu) {
> -                    if (qemuSetupCgroupVcpuPin(cgroup_vcpu,
> -                                               vm->def->cputune.vcpupin,
> -                                               vm->def->cputune.nvcpupin, i) < 0) {
> -                        virReportError(VIR_ERR_OPERATION_INVALID,
> -                                       _("failed to set cpuset.cpus in cgroup"
> -                                         " for vcpu %zu"), i);
> -                        ret = -1;
> -                        goto cleanup;
> -                    }
> -                } else {
> -                    if (virProcessSetAffinity(cpupids[i],
> -                                              vcpupin->cpumask) < 0) {
> -                        virReportError(VIR_ERR_SYSTEM_ERROR,
> -                                       _("failed to set cpu affinity for vcpu %zu"),
> -                                       i);
> -                        ret = -1;
> -                        goto cleanup;
> -                    }
> -                }
>              }
> -
>              virCgroupFree(&cgroup_vcpu);
>  
>              if (qemuProcessSetSchedParams(i, cpupids[i],
> 




More information about the libvir-list mailing list