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

Martin Kletzander mkletzan at redhat.com
Wed Dec 3 13:54:42 UTC 2014


On Wed, Dec 03, 2014 at 10:00:52AM +0100, Peter Krempa wrote:
>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.
>

DUH! Dumb me, thanks for catching that...

Martin

>> +}
>> +
>>  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: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20141203/bb981cc0/attachment-0001.sig>


More information about the libvir-list mailing list