[libvirt] [PATCH v2.1 05/21] refactor virDomainVcpuPinAdd()

Daniel Veillard veillard at redhat.com
Wed Aug 22 07:03:53 UTC 2012


On Tue, Aug 21, 2012 at 05:18:28PM +0800, Hu Tao wrote:
> ---
>  src/conf/domain_conf.c   |   81 ++++++++++++++++++----------------------------
>  src/conf/domain_conf.h   |    3 +-
>  src/libxl/libxl_driver.c |   13 +++++++-
>  src/qemu/qemu_driver.c   |   26 +++++++++++++--
>  src/xen/xend_internal.c  |   13 +++++++-
>  5 files changed, 82 insertions(+), 54 deletions(-)
> 
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 4e52177..56ee4c9 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -10921,69 +10921,52 @@ cleanup:
>      return bitmap;
>  }
>  
> -int
> -virDomainVcpuPinAdd(virDomainDefPtr def,
> -                    unsigned char *cpumap,
> -                    int maplen,
> -                    int vcpu)
> +int virDomainVcpuPinAdd(virDomainVcpuPinDefPtr *vcpupin_list,
> +                        int *nvcpupin,
> +                        unsigned char *cpumap,
> +                        int maplen,
> +                        int vcpu)
>  {
> -    virDomainVcpuPinDefPtr *vcpupin_list = NULL;
>      virDomainVcpuPinDefPtr vcpupin = NULL;
>      char *cpumask = NULL;
>  
> -    if ((cpumask = bitmapFromBytemap(cpumap, maplen)) == NULL)
> -        goto cleanup;
> -
> -    /* No vcpupin exists yet. */
> -    if (!def->cputune.nvcpupin) {
> -        if (VIR_ALLOC(vcpupin) < 0) {
> -            virReportOOMError();
> -            goto cleanup;
> -        }
> +    if (!vcpupin_list)
> +        return -1;
>  
> -        if (VIR_ALLOC(vcpupin_list) < 0) {
> -            virReportOOMError();
> -            VIR_FREE(vcpupin);
> -            goto cleanup;
> -        }
> +    if ((cpumask = bitmapFromBytemap(cpumap, maplen)) == NULL)
> +        return -1;
>  
> +    vcpupin = virDomainVcpuPinFindByVcpu(vcpupin_list,
> +                                         *nvcpupin,
> +                                         vcpu);
> +    if (vcpupin) {
>          vcpupin->vcpuid = vcpu;
>          vcpupin->cpumask = cpumask;
> -        vcpupin_list[def->cputune.nvcpupin++] = vcpupin;
>  
> -        def->cputune.vcpupin = vcpupin_list;
> -    } else {
> -        if (virDomainVcpuPinIsDuplicate(def->cputune.vcpupin,
> -                                        def->cputune.nvcpupin,
> -                                        vcpu)) {
> -            vcpupin = virDomainVcpuPinFindByVcpu(def->cputune.vcpupin,
> -                                                 def->cputune.nvcpupin,
> -                                                 vcpu);
> -            vcpupin->vcpuid = vcpu;
> -            vcpupin->cpumask = cpumask;
> -        } else {
> -            if (VIR_ALLOC(vcpupin) < 0) {
> -                virReportOOMError();
> -                goto cleanup;
> -            }
> +        return 0;
> +    }
> +
> +    /* No existing vcpupin matches vcpu, adding a new one */
> +
> +    if (VIR_ALLOC(vcpupin) < 0) {
> +        virReportOOMError();
> +        VIR_FREE(cpumask);
> +        return -1;
> +    }
> +    vcpupin->vcpuid = vcpu;
> +    vcpupin->cpumask = cpumask;
>  
> -            if (VIR_REALLOC_N(def->cputune.vcpupin, def->cputune.nvcpupin + 1) < 0) {
> -                virReportOOMError();
> -                VIR_FREE(vcpupin);
> -                goto cleanup;
> -            }
>  
> -            vcpupin->vcpuid = vcpu;
> -            vcpupin->cpumask = cpumask;
> -            def->cputune.vcpupin[def->cputune.nvcpupin++] = vcpupin;
> -       }
> +    if (VIR_REALLOC_N(vcpupin_list, *nvcpupin + 1) < 0) {
> +        virReportOOMError();
> +        VIR_FREE(cpumask);
> +        VIR_FREE(vcpupin);
> +        return -1;
>      }
>  
> -    return 0;
> +    vcpupin_list[(*nvcpupin)++] = vcpupin;
>  
> -cleanup:
> -    VIR_FREE(cpumask);
> -    return -1;
> +    return 0;
>  }
>  
>  int
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 74abe6c..30aef6b 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -1968,7 +1968,8 @@ int virDomainCpuSetParse(const char *str,
>  char *virDomainCpuSetFormat(char *cpuset,
>                              int maxcpu);
>  
> -int virDomainVcpuPinAdd(virDomainDefPtr def,
> +int virDomainVcpuPinAdd(virDomainVcpuPinDefPtr *vcpupin_list,
> +                        int *nvcpupin,
>                          unsigned char *cpumap,
>                          int maplen,
>                          int vcpu);
> diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
> index 398a9a2..7881cd1 100644
> --- a/src/libxl/libxl_driver.c
> +++ b/src/libxl/libxl_driver.c
> @@ -2454,7 +2454,18 @@ libxlDomainPinVcpu(virDomainPtr dom, unsigned int vcpu, unsigned char *cpumap,
>          goto cleanup;
>      }
>  
> -    if (virDomainVcpuPinAdd(vm->def, cpumap, maplen, vcpu) < 0) {
> +    if (!vm->def->cputune->vcpupin) {
> +        if (VIR_ALLOC(vm->def->cputune->vcpupin) < 0) {
> +            virReportOOMError();
> +            goto cleanup;
> +        }
> +        vm->def->cputune->nvcpupin = 0;
> +    }
> +    if (virDomainVcpuPinAdd(vm->def->cputune->vcpupin
> +                            &vm->def->cputune->nvcpupin,
> +                            cpumap,
> +                            maplen,
> +                            vcpu) < 0) {
>          virReportError(VIR_ERR_INTERNAL_ERROR,
>                         "%s", _("failed to update or add vcpupin xml"));
>          goto cleanup;
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 109d18d..17c66d7 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -3785,7 +3785,18 @@ qemudDomainPinVcpuFlags(virDomainPtr dom,
>                  goto cleanup;
>              }
>          } else {
> -            if (virDomainVcpuPinAdd(vm->def, cpumap, maplen, vcpu) < 0) {
> +            if (!vm->def->cputune.vcpupin) {
> +                if (VIR_ALLOC(vm->def->cputune.vcpupin) < 0) {
> +                    virReportOOMError();
> +                    goto cleanup;
> +                }
> +                vm->def->cputune.nvcpupin = 0;
> +            }
> +            if (virDomainVcpuPinAdd(vm->def->cputune.vcpupin,
> +                                    &vm->def->cputune.nvcpupin,
> +                                    cpumap,
> +                                    maplen,
> +                                    vcpu) < 0) {
>                  virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>                                 _("failed to update or add vcpupin xml of "
>                                   "a running domain"));
> @@ -3807,7 +3818,18 @@ qemudDomainPinVcpuFlags(virDomainPtr dom,
>                  goto cleanup;
>              }
>          } else {
> -            if (virDomainVcpuPinAdd(persistentDef, cpumap, maplen, vcpu) < 0) {
> +            if (!persistentDef->cputune.vcpupin) {
> +                if (VIR_ALLOC(persistentDef->cputune.vcpupin) < 0) {
> +                    virReportOOMError();
> +                    goto cleanup;
> +                }
> +                persistentDef->cputune.nvcpupin = 0;
> +            }
> +            if (virDomainVcpuPinAdd(persistentDef->cputune.vcpupin,
> +                                    &persistentDef->cputune.nvcpupin,
> +                                    cpumap,
> +                                    maplen,
> +                                    vcpu) < 0) {
>                  virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>                                 _("failed to update or add vcpupin xml of "
>                                   "a persistent domain"));
> diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
> index f93b249..f29f533 100644
> --- a/src/xen/xend_internal.c
> +++ b/src/xen/xend_internal.c
> @@ -2296,7 +2296,18 @@ xenDaemonDomainPinVcpu(virDomainPtr domain, unsigned int vcpu,
>          goto cleanup;
>  
>      if (ret == 0) {
> -        if (virDomainVcpuPinAdd(def, cpumap, maplen, vcpu) < 0) {
> +        if (!def->cputune.vcpupin) {
> +            if (VIR_ALLOC(def->cputune.vcpupin) < 0) {
> +                virReportOOMError();
> +                goto cleanup;
> +            }
> +            def->cputune.nvcpupin = 0;
> +        }
> +        if (virDomainVcpuPinAdd(def->cputune->vcpupin,
> +                                &def->cputune->nvcpupin,
> +                                cpumap,
> +                                maplen,
> +                                vcpu) < 0) {
>              virReportError(VIR_ERR_INTERNAL_ERROR,
>                             "%s", _("failed to add vcpupin xml entry"));
>              return -1;

  Clearly you didn't tried to compile the xen drivers !
Please get a recent fedora and install xen on it to be able to catch
those. i had to squash in the following. With that ACK,

Daniel

diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
index 7881cd1..d8ecf13 100644
--- a/src/libxl/libxl_driver.c
+++ b/src/libxl/libxl_driver.c
@@ -2454,15 +2454,15 @@ libxlDomainPinVcpu(virDomainPtr dom, unsigned int vcpu, unsigned char *cpumap,
         goto cleanup;
     }
 
-    if (!vm->def->cputune->vcpupin) {
-        if (VIR_ALLOC(vm->def->cputune->vcpupin) < 0) {
+    if (!vm->def->cputune.vcpupin) {
+        if (VIR_ALLOC(vm->def->cputune.vcpupin) < 0) {
             virReportOOMError();
             goto cleanup;
         }
-        vm->def->cputune->nvcpupin = 0;
+        vm->def->cputune.nvcpupin = 0;
     }
-    if (virDomainVcpuPinAdd(vm->def->cputune->vcpupin
-                            &vm->def->cputune->nvcpupin,
+    if (virDomainVcpuPinAdd(vm->def->cputune.vcpupin,
+                            &vm->def->cputune.nvcpupin,
                             cpumap,
                             maplen,
                             vcpu) < 0) {
diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
index f29f533..99def42 100644
--- a/src/xen/xend_internal.c
+++ b/src/xen/xend_internal.c
@@ -2303,8 +2303,8 @@ xenDaemonDomainPinVcpu(virDomainPtr domain, unsigned int vcpu,
             }
             def->cputune.nvcpupin = 0;
         }
-        if (virDomainVcpuPinAdd(def->cputune->vcpupin,
-                                &def->cputune->nvcpupin,
+        if (virDomainVcpuPinAdd(def->cputune.vcpupin,
+                                &def->cputune.nvcpupin,
                                 cpumap,
                                 maplen,
                                 vcpu) < 0) {

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list