[libvirt] [PATCH 1/2] conf: Rework virDomainObjListFindByUUID to allow more concurrent APIs

Peter Krempa pkrempa at redhat.com
Wed Dec 3 09:00:52 UTC 2014


On 12/03/14 06:49, Martin Kletzander wrote:
> Currently, when there is an API that's blocking with locked domain and
> second API that's waiting in virDomainObjListFindByUUID() for the domain
> lock (with the domain list locked) no other API can be executed on any
> domain on the whole hypervisor because all would wait for the domain
> list to be locked.  This patch adds new optional approach to this in
> which the domain is only ref'd (reference counter is incremented)
> instead of being locked and is locked *after* the list itself is
> unlocked.  We might consider only ref'ing the domain in the future and
> leaving locking on particular APIs, but that's no tonight's fairy tale.
> 
> Signed-off-by: Martin Kletzander <mkletzan at redhat.com>
> ---
>  src/conf/domain_conf.c   | 27 ++++++++++++++++++++++++---
>  src/conf/domain_conf.h   |  2 ++
>  src/libvirt_private.syms |  1 +
>  3 files changed, 27 insertions(+), 3 deletions(-)
> 
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 2d81c37..e5bb572 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -1068,8 +1068,10 @@ virDomainObjPtr virDomainObjListFindByID(virDomainObjListPtr doms,
>  }
> 
> 
> -virDomainObjPtr virDomainObjListFindByUUID(virDomainObjListPtr doms,
> -                                           const unsigned char *uuid)
> +static virDomainObjPtr
> +virDomainObjListFindByUUIDInternal(virDomainObjListPtr doms,
> +                                   const unsigned char *uuid,
> +                                   bool ref)
>  {
>      char uuidstr[VIR_UUID_STRING_BUFLEN];
>      virDomainObjPtr obj;
> @@ -1078,12 +1080,31 @@ virDomainObjPtr virDomainObjListFindByUUID(virDomainObjListPtr doms,
>      virUUIDFormat(uuid, uuidstr);
> 
>      obj = virHashLookup(doms->objs, uuidstr);
> +    if (ref) {
> +        virObjectRef(obj);
> +        virObjectUnlock(doms);
> +    }
>      if (obj)
>          virObjectLock(obj);
> -    virObjectUnlock(doms);
> +    if (!ref)
> +        virObjectUnlock(doms);
>      return obj;
>  }
> 
> +virDomainObjPtr
> +virDomainObjListFindByUUID(virDomainObjListPtr doms,
> +                           const unsigned char *uuid)
> +{
> +    return virDomainObjListFindByUUIDInternal(doms, uuid, false);
> +}
> +
> +virDomainObjPtr
> +virDomainObjListFindByUUIDRef(virDomainObjListPtr doms,
> +                              const unsigned char *uuid)
> +{
> +    return virDomainObjListFindByUUIDInternal(doms, uuid, false);

Umm both call the helper with @ref being false? That probably isn't right.

> +}
> +
>  static int virDomainObjListSearchName(const void *payload,
>                                        const void *name ATTRIBUTE_UNUSED,
>                                        const void *data)

Peter

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20141203/5bb18763/attachment-0001.sig>


More information about the libvir-list mailing list