[libvirt] [PATCH v3 05/13] Make virDomainObjList self-locking via virObjectLockable

Daniel P. Berrange berrange at redhat.com
Tue Feb 5 14:53:13 UTC 2013


On Mon, Feb 04, 2013 at 05:22:59PM +0100, Jiri Denemark wrote:
> On Fri, Feb 01, 2013 at 11:18:27 +0000, Daniel P. Berrange wrote:
> > From: "Daniel P. Berrange" <berrange at redhat.com>
> > 
> > Switch virDomainObjList to inherit from virObjectLockable and
> > make all the APIs acquire/release the mutex when running. This
> > makes virDomainObjList completely self-locking and no longer
> > reliant on the hypervisor driver locks
> > ---
> >  src/conf/domain_conf.c | 75 ++++++++++++++++++++++++++++++++++++++++----------
> >  1 file changed, 61 insertions(+), 14 deletions(-)
> > 
> > diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> > index 79da5eb..a1e899f 100644
> > --- a/src/conf/domain_conf.c
> > +++ b/src/conf/domain_conf.c
> > @@ -60,7 +60,7 @@ verify(VIR_DOMAIN_VIRT_LAST <= 32);
> >  
> >  
> >  struct _virDomainObjList {
> > -    virObject parent;
> > +    virObjectLockable parent;
> >  
> >      /* uuid string -> virDomainObj  mapping
> >       * for O(1), lockless lookup-by-uuid */
> > @@ -715,7 +715,7 @@ static int virDomainObjOnceInit(void)
> >                                            virDomainObjDispose)))
> >          return -1;
> >  
> > -    if (!(virDomainObjListClass = virClassNew(virClassForObject(),
> > +    if (!(virDomainObjListClass = virClassNew(virClassForObjectLockable(),
> >                                                "virDomainObjList",
> >                                                sizeof(virDomainObjList),
> >                                                virDomainObjListDispose)))
> 
> These two hunks should go to 3/13.
> 
> ...
> > @@ -1880,25 +1886,32 @@ void virDomainObjAssignDef(virDomainObjPtr domain,
> >   * current def is Live
> >   *
> >   */
> > -virDomainObjPtr virDomainObjListAdd(virDomainObjListPtr doms,
> > -                                    virCapsPtr caps,
> > -                                    const virDomainDefPtr def,
> > -                                    unsigned int flags,
> > -                                    virDomainDefPtr *oldDef)
> > +static virDomainObjPtr
> > +virDomainObjListAddLocked(virDomainObjListPtr doms,
> > +                          virCapsPtr caps,
> > +                          const virDomainDefPtr def,
> > +                          unsigned int flags,
> > +                          virDomainDefPtr *oldDef)
> >  {
> >      virDomainObjPtr vm;
> >      char uuidstr[VIR_UUID_STRING_BUFLEN];
> > +
> >      if (oldDef)
> >          *oldDef = false;
> >  
> > +    virUUIDFormat(def->uuid, uuidstr);
> > +
> >      /* See if a VM with matching UUID already exists */
> > -    if ((vm = virDomainObjListFindByUUID(doms, def->uuid))) {
> > +    if ((vm = virHashLookup(doms->objs, uuidstr))) {
> > +        virObjectLock(vm);
> >          /* UUID matches, but if names don't match, refuse it */
> >          if (STRNEQ(vm->def->name, def->name)) {
> >              virUUIDFormat(vm->def->uuid, uuidstr);
> >              virReportError(VIR_ERR_OPERATION_FAILED,
> >                             _("domain '%s' is already defined with uuid %s"),
> >                             vm->def->name, uuidstr);
> > +            virObjectUnlock(vm);
> > +            vm = NULL;
> 
> These two lines should go to 4/13.
> 
> >              goto cleanup;
> >          }
> >  
> > @@ -1908,6 +1921,8 @@ virDomainObjPtr virDomainObjListAdd(virDomainObjListPtr doms,
> >                  virReportError(VIR_ERR_OPERATION_INVALID,
> >                                 _("domain is already active as '%s'"),
> >                                 vm->def->name);
> > +                virObjectUnlock(vm);
> > +                vm = NULL;
> >                  goto cleanup;
> >              }
> >          }
> 
> And this hunk should go to 4/13 too.
> 
> > @@ -1934,12 +1949,11 @@ virDomainObjPtr virDomainObjListAdd(virDomainObjListPtr doms,
> >          }
> >      } else {
> >          /* UUID does not match, but if a name matches, refuse it */
> > -        if ((vm = virDomainObjListFindByName(doms, def->name))) {
> > +        if ((vm = virHashSearch(doms->objs, virDomainObjListSearchName, def->name))) {
> 
> I believe you wanted to add virObjectLock(vm) here rather than...
> 
> >              virUUIDFormat(vm->def->uuid, uuidstr);
> >              virReportError(VIR_ERR_OPERATION_FAILED,
> >                             _("domain '%s' already exists with uuid %s"),
> >                             def->name, uuidstr);
> > -            virObjectUnlock(vm);
> 
> ...removing this unlock here.

Yes, that is correct. I've made that change

Given that all other comments are just moving chunks to previous
patches, do you want to see a v2 ?

Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list