[libvirt] [PATCH v2 10/11] libxl: Grab modify job for changing domain XML

Nikolay Shirokovskiy nshirokovskiy at virtuozzo.com
Thu Jun 6 13:19:26 UTC 2019



On 05.06.2019 12:09, Michal Privoznik wrote:
> The reasoning here is the same as in qemu driver fixed in
> previous commit. Long story short, changing an XML of a domain
> requires modify job to be acquired.
> 
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
>  src/libxl/libxl_domain.c    | 57 +++++++++++++++++++++++++++++++++++++
>  src/libxl/libxl_domain.h    |  7 +++++
>  src/libxl/libxl_driver.c    | 24 ++++------------
>  src/libxl/libxl_migration.c | 14 +++------
>  4 files changed, 73 insertions(+), 29 deletions(-)
> 
> diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c
> index 2d8569e592..f2e1af52e5 100644
> --- a/src/libxl/libxl_domain.c
> +++ b/src/libxl/libxl_domain.c
> @@ -65,6 +65,63 @@ libxlDomainObjPrivateOnceInit(void)
>  
>  VIR_ONCE_GLOBAL_INIT(libxlDomainObjPrivate);
>  
> +
> +/**
> + * libxlDomainObjListAdd:
> + * @driver: libxl driver
> + * @def: domain definition
> + * @oldDef: previous domain definition
> + * @live: whether @def is live definition
> + * @flags: an bitwise-OR of virDomainObjListAdd flags
> + *
> + * Add a domain onto the list of domain object and sets its
> + * definition. If @oldDef is not NULL and there was pre-existing
> + * definition it's returned in @oldDef.
> + *
> + * In addition to that, if definition of an existing domain is
> + * changed a MODIFY job is acquired prior to that.
> + *
> + * Returns: domain object pointer on success,
> + *          NULL otherwise.
> + */
> +virDomainObjPtr
> +libxlDomainObjListAdd(libxlDriverPrivatePtr driver,
> +                      virDomainDefPtr def,
> +                      virDomainDefPtr *oldDef,
> +                      bool live,
> +                      unsigned int flags)
> +{
> +    virDomainObjPtr vm = NULL;
> +
> +    if (!(vm = virDomainObjListAdd(driver->domains, def, driver->xmlopt, flags)))
> +        return NULL;
> +
> +    /* At this point, @vm is locked. If it doesn't have any
> +     * definition set, then the call above just added it and
> +     * there can't be anybody else using the object. It's safe to
> +     * just set the definition without acquiring job. */
> +    if (!vm->def) {
> +        virDomainObjAssignDef(vm, def, live, oldDef);
> +        VIR_RETURN_PTR(vm);
> +    }
> +
> +    /* Bad luck. Domain was pre-existing and this call is trying
> +     * to update its definition. Modify job MUST be acquired. */
> +    if (libxlDomainObjBeginJob(driver, vm, LIBXL_JOB_MODIFY) < 0) {
> +        if (!vm->persistent)
> +            virDomainObjListRemove(driver->domains, vm);
> +        virDomainObjEndAPI(&vm);
> +        return NULL;
> +    }
> +
> +    virDomainObjAssignDef(vm, def, live, oldDef);
> +
> +    libxlDomainObjEndJob(driver, vm);
> +
> +    return vm;
> +}
> +
> +
>  static int
>  libxlDomainObjInitJob(libxlDomainObjPrivatePtr priv)
>  {
> diff --git a/src/libxl/libxl_domain.h b/src/libxl/libxl_domain.h
> index 769ee8ec4d..b5d5127e91 100644
> --- a/src/libxl/libxl_domain.h
> +++ b/src/libxl/libxl_domain.h
> @@ -83,6 +83,13 @@ extern const struct libxl_event_hooks ev_hooks;
>  int
>  libxlDomainObjPrivateInitCtx(virDomainObjPtr vm);
>  
> +virDomainObjPtr
> +libxlDomainObjListAdd(libxlDriverPrivatePtr driver,
> +                      virDomainDefPtr def,
> +                      virDomainDefPtr *oldDef,
> +                      bool live,
> +                      unsigned int flags);
> +
>  int
>  libxlDomainObjBeginJob(libxlDriverPrivatePtr driver,
>                         virDomainObjPtr obj,
> diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
> index 809d298ac1..9c9a30bb90 100644
> --- a/src/libxl/libxl_driver.c
> +++ b/src/libxl/libxl_driver.c
> @@ -601,12 +601,8 @@ libxlAddDom0(libxlDriverPrivatePtr driver)
>      if (virUUIDParse("00000000-0000-0000-0000-000000000000", def->uuid) < 0)
>          goto cleanup;
>  
> -    if (!(vm = virDomainObjListAdd(driver->domains, def,
> -                                   driver->xmlopt,
> -                                   0)))
> +    if (!(vm = libxlDomainObjListAdd(driver, def, &oldDef, false, 0)))
>          goto cleanup;
> -
> -    virDomainObjAssignDef(vm, def, false, &oldDef);
>      def = NULL;
>  
>      vm->persistent = 1;
> @@ -1030,12 +1026,9 @@ libxlDomainCreateXML(virConnectPtr conn, const char *xml,
>      if (virDomainCreateXMLEnsureACL(conn, def) < 0)
>          goto cleanup;
>  
> -    if (!(vm = virDomainObjListAdd(driver->domains, def,
> -                                   driver->xmlopt,
> -                                   VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE)))
> +    if (!(vm = libxlDomainObjListAdd(driver, def, NULL, true,
> +                                     VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE)))
>          goto cleanup;
> -
> -    virDomainObjAssignDef(vm, def, true, NULL);
>      def = NULL;
>  
>      if (libxlDomainObjBeginJob(driver, vm, LIBXL_JOB_MODIFY) < 0) {
> @@ -1950,12 +1943,9 @@ libxlDomainRestoreFlags(virConnectPtr conn, const char *from,
>      if (virDomainRestoreFlagsEnsureACL(conn, def) < 0)
>          goto cleanup;
>  
> -    if (!(vm = virDomainObjListAdd(driver->domains, def,
> -                                   driver->xmlopt,
> +    if (!(vm = libxlDomainObjListAdd(driver, def, NULL, true,
>                                     VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE)))

just indentation, so

Reviewed-by: Nikolay Shirokovskiy <nshirokovskiy at virtuozzo.com>




More information about the libvir-list mailing list