[libvirt] [PATCH 3/5] Push nwfilter update locking up to top level

Daniel P. Berrange berrange at redhat.com
Mon Jan 27 17:15:36 UTC 2014


On Thu, Jan 23, 2014 at 04:13:57PM -0500, Stefan Berger wrote:
> On 01/23/2014 07:37 AM, Daniel P. Berrange wrote:
> 
> Makes sense... there are other paths as well:
> 
> - SIGHUP or restart of libvirt that recreates all filters
> - late instantiation of filters following detection of VM's IP address

Ok, yes, I see those now.

I was struggling to understand just what codepaths could
result in __virNWFilterInstantiateFilter being invoked
so I generated a callgraph for that function

  http://berrange.fedorapeople.org/nwfilter.ps

tracing the calls, confirms there are the 6 entry points

 - filter define
 - filter undefine
 - state reload on sighup or dbus notify
 - vm startup / hotplug
 - vm shutdown / hotunplug
 - dhcp / ip snooping

the first 3 will require write locks, while the last three will only
require read locks.  I'm squashing the conversion to read/write lock
into this patch, since otherwise the intermediate state would be
deadlock prone.

> 
> src/conf/nwfilter_conf.c::virNWFilterObjLoad : I don't see this
> function grabbing the lock. I think this is missing.

virNWFilterObjLoad is called by StateInitialize or StateReload
and only the reload function requires the lock. So I'm adding
the lock to that function


> >diff --git a/src/nwfilter/nwfilter_gentech_driver.c b/src/nwfilter/nwfilter_gentech_driver.c
> >index 89913cf8..f0e78ed 100644
> >--- a/src/nwfilter/nwfilter_gentech_driver.c
> >+++ b/src/nwfilter/nwfilter_gentech_driver.c
> >@@ -935,7 +935,6 @@ _virNWFilterInstantiateFilter(virNWFilterDriverStatePtr driver,
> >      int ifindex;
> >      int rc;
> >
> >-    virNWFilterLockFilterUpdates();
> >
> >      /* after grabbing the filter update lock check for the interface; if
> >         it's not there anymore its filters will be or are being removed
> >@@ -964,7 +963,6 @@ _virNWFilterInstantiateFilter(virNWFilterDriverStatePtr driver,
> >                                          foundNewFilter);
> >
> >  cleanup:
> >-    virNWFilterUnlockFilterUpdates();
> >
> >      return rc;
> >  }
> 
> This function is called by virNWFilterInstantiateFilter and
> virNWFilterUpdateInstantiateFilter. So, in the former case this is
> called when a VM is started, in the latter case if VMs' filters are
> updated while the VM is running. I think you are covering the VM
> creation case with the above calls for lxc and further below with
> the changes to the qemu driver and the uml driver.
> 
> There is at least one other part that needs to be covered:
> 
> src/conf/nwfilter_conf.c::virNWFilterInstFiltersOnAllVMs :: kicked
> off by nwfilterStateReload upon SIGHUP. We need a lock there now.
> 
> src/conf/nwfilter_conf.c::virNWFilterTriggerVMFilterRebuild::
>     - called by virNWFilterTestUnassignDef:
>         - called by src/nwfilter/nwfilter/nwfilterUndefine:: You
> seem to just reorder some locks there; now we need a (writer) lock
> there
>     - called by virNWFilterObjAssignDef: which must be called with
> lock called following above reasoning


Yep, I concur and have added lock calls to the StateReload function

> >@@ -984,8 +982,6 @@ virNWFilterInstantiateFilterLate(virNWFilterDriverStatePtr driver,
> >      int rc;
> >      bool foundNewFilter = false;
> >
> >-    virNWFilterLockFilterUpdates();
> >-
> >      rc = __virNWFilterInstantiateFilter(driver,
> >                                          vmuuid,
> >                                          true,
> >@@ -1009,8 +1005,6 @@ virNWFilterInstantiateFilterLate(virNWFilterDriverStatePtr driver,
> >          }
> >      }
> >
> >-    virNWFilterUnlockFilterUpdates();
> >-
> >      return rc;
> >  }
> 
> This function here is called by
> src/nwfilter/nwfilter_learnip.c::learnIPAddressThread
> src/nwfilter/nwfilter_dhcpsnoop.c::virNWFilterSnoopIPLeaseInstallRule
> 
> They instantiate the filters once a VM's IP address has been
> detected. So this is where the *Late() comes from.
> 
> If you remove the locking from here, you have to lock it there.
> Considering what you do layer, I would keep the lock here and
> convert this into a reader lock layer on.

Yes, now I'm squashing the read/write lock conversion in, I'll
keep the locking in this location.

Regards,
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