[libvirt] [PATCH 0/3] allow fixing tap-bridge connections when network is restarted

Michal Privoznik mprivozn at redhat.com
Wed Mar 22 15:32:10 UTC 2017


On 03/21/2017 04:03 PM, Laine Stump wrote:
> It's been a long-standing problem that when you stop and restart a
> libvirt network, the guest tap devices are no longer connected to the
> network. Until now the only way to recover from this was to either
> shutdown and restart all the affected guests, or to detach and then
> re-attach all affected guest network devices.
>
> These patches permit the situation to be remedied by just restarting
> libvirtd - when the hypervisor drivers are notifying the network
> drivers of each connection, the network can retrieve the current
> "master" for the tap device and compare it to the network's bridge
> device. If they don't match, then it disconnects the tap from any
> incorrect bridge and connects to the correct bridge.
>
> ***
>
> For now, that's as far as we go - *semi*-automated (since you need to
> restart libvirtd for it to happen). My intent is for this to be
> completely automated, but the logic to do that is a bit "convoluted"
> so I've deferred trying to implement it until I've given it more
> thought - a few different trains of thought have led to dead-ends, and
> so far only one seems reasonably doable:
>
> * add a networkStartCallback list to the network driver state object.
>
> * as each hypervisor driver that uses the network driver is
>   initialized, it will call an internal-only function in the network
>   driver to register a callback.
>
> * whenever a network is started, it will call all the registered
>   callback functions (sending the name of the network being started,
>   and some HV-specific context pointer).
>
> * Each hypervisor's callback function will look through all of its
>   active domains for interfaces that are using the given network, and
>   for each such interface, will call networkNotifyActualDevice() (the
>   function that has been updated in Patch 3/3 to reconnect taps to
>   bridges).
>
> The "convoluted" part here is that we need to make sure there is
> enough (but not too much!) locking/refcounting both when adding items
> to the callback list (which should only be done single threaded, since
> it happens during the driver initializations) and when the
> networkStart() function (in some state of lockedness/refcountedness)
> calls over to some e.g. qemu function that will then need to do some
> amount of locking (at least on each domain as it is processed) and
> then calls back into the network driver (which will need "some amount"
> of locking/refcounting). Since we're calling from network driver into
> qemu into network driver, while the normal nesting is just calling
> from qemu into network, I want to be sure there is no possibility for
> a deadlock. (Also, I want to avoid making the list of callbacks any
> more complicated than absolutely necessary - the "in" thing to do
> these days seems to be to allocate a hash table, but there's a lot of
> extra code required for that (see util/virclosecallbacks.[hc]) which
> seems like overkill for a list of maximum 4-5 items that will *never*
> change after the driver initialization - if anyone has ideas/opinions
> about that, please speak up.
>
>
> Laine Stump (2):
>   util: new function virNetDevGetMaster()
>   util: new function virNetDevTapAttachBridge()
>
> root (1):
>   network: reconnect tap devices during networkNotifyActualDevice

You might want to reset the owner here ;-)

>
>  src/libvirt_private.syms    |   2 +
>  src/network/bridge_driver.c |  30 +++++++++++-
>  src/util/virnetdev.c        |  49 +++++++++++++++++++
>  src/util/virnetdev.h        |   3 ++
>  src/util/virnetdevtap.c     | 111 +++++++++++++++++++++++++++++---------------
>  src/util/virnetdevtap.h     |  12 +++++
>  6 files changed, 169 insertions(+), 38 deletions(-)
>

ACK series.

Michal




More information about the libvir-list mailing list