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@xxxxxxxxxx> > --- > 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
Attachment:
signature.asc
Description: OpenPGP digital signature
-- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list