[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