[libvirt] [PATCH] qemu: Avoid holding the driver lock in trivial snapshot API's

Peter Krempa pkrempa at redhat.com
Mon Sep 24 20:40:30 UTC 2012


On 09/24/12 18:51, Eric Blake wrote:
> On 09/24/2012 06:57 AM, Peter Krempa wrote:
>> In most of the snapshot API's there's no need to hold the driver lock
>> the whole time.
>>
>> This patch adds helper functions that get the domain object in functions
>> that don't require the driver lock and simplifies call paths from
>> snapshot-related API's.
>> ---
>>   src/conf/domain_conf.c |   3 +-
>>   src/qemu/qemu_driver.c | 306 +++++++++++++++----------------------------------
>>   2 files changed, 94 insertions(+), 215 deletions(-)
>>
>
>>   void virDomainObjUnlock(virDomainObjPtr obj)
>>   {
>> -    virMutexUnlock(&obj->lock);
>> +    if (obj)
>> +        virMutexUnlock(&obj->lock);
>>   }
>
> I agree with Daniel that this hunk is bad.  But most of the patch is
> worthwhile...

Ok, I'll get rid of this.

>
>> +/* Looks up the domain obj and unlocks the driver */
>> +static virDomainObjPtr
>> +qemuDomObjFromDomain(virDomainPtr domain)
>> +{
>> +    struct qemud_driver *driver = domain->conn->privateData;
>> +    virDomainObjPtr vm;
>> +    char uuidstr[VIR_UUID_STRING_BUFLEN];
>> +
>> +    qemuDriverLock(driver);
>> +    vm = virDomainFindByUUID(&driver->domains, domain->uuid);
>> +    qemuDriverUnlock(driver);
>> +    if (!vm) {
>> +        virUUIDFormat(domain->uuid, uuidstr);
>> +        virReportError(VIR_ERR_NO_DOMAIN,
>> +                       _("no domain with matching uuid '%s'"), uuidstr);
>> +    }
>> +
>> +    return vm;
>> +}
>
> This is a nice function for one-shot lookups, when the rest of the
> function does not need the driver locked.
>
>
>> @@ -11305,59 +11359,39 @@ static int qemuDomainSnapshotListNames(virDomainPtr domain, char **names,
>>                                          int nameslen,
>>                                          unsigned int flags)
>>   {
>> -    struct qemud_driver *driver = domain->conn->privateData;
>>       virDomainObjPtr vm = NULL;
>>       int n = -1;
>>
>>       virCheckFlags(VIR_DOMAIN_SNAPSHOT_LIST_ROOTS |
>>                     VIR_DOMAIN_SNAPSHOT_FILTERS_ALL, -1);
>>
>> -    qemuDriverLock(driver);
>> -    vm = virDomainFindByUUID(&driver->domains, domain->uuid);
>> -    if (!vm) {
>> -        char uuidstr[VIR_UUID_STRING_BUFLEN];
>> -        virUUIDFormat(domain->uuid, uuidstr);
>> -        virReportError(VIR_ERR_NO_DOMAIN,
>> -                       _("no domain with matching uuid '%s'"), uuidstr);
>> +    if (!(vm = qemuDomObjFromDomain(domain)))
>>           goto cleanup;
>> -    }
>
> And this is a nice usage of the new helpers (probably a LOT more APIs
> that can use them, rather than just snapshots).

Yes, there's a lot of API's that don't need the driver locked. I just 
chose a subset so this patch doesn't grow out of control and is hard to 
review. I also wanted to establish a pattern with this that we can use 
later on, as the usual way to add new API's is to copy something existing.

>
>>
>>       n = virDomainSnapshotObjListGetNames(vm->snapshots, NULL, names, nameslen,
>>                                            flags);
>>
>>   cleanup:
>> -    if (vm)
>> -        virDomainObjUnlock(vm);
>> -    qemuDriverUnlock(driver);
>> +    virDomainObjUnlock(vm);
>>       return n;
>
> This hunk, however, should be:
>
> cleanup:
>      if (vm)
>          virDomainObjUnlock(vm);
>      return n;
>
> Looking forward to v2.
>

Posting v2 now.




More information about the libvir-list mailing list