[libvirt] [PATCH v6 20/23] lxc, libxl: notify network driver of NICs during reconnect

Laine Stump laine at laine.org
Fri Jun 7 11:48:10 UTC 2019


On 5/23/19 11:32 AM, Daniel P. Berrangé wrote:
> When starting up it is important to notify the network driver of any
> NICs which are used by running guests so that it can account for any
> resources they are using.


Yeah, we should have been doing that even before your changes. It just 
wasn't as important in the past (since mostly all it did was update the 
use counter for the network, unless the guest was using macvtap 
passthrough mode).


Reviewed-by: Laine Stump <laine at laine.org>


>
> Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
> ---
>   src/libxl/libxl_driver.c | 30 ++++++++++++++++++++++++++++++
>   src/lxc/lxc_process.c    | 30 ++++++++++++++++++++++++++++++
>   2 files changed, 60 insertions(+)
>
> diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
> index 2b9c6f1866..e2819eb0cc 100644
> --- a/src/libxl/libxl_driver.c
> +++ b/src/libxl/libxl_driver.c
> @@ -352,6 +352,34 @@ libxlAutostartDomain(virDomainObjPtr vm,
>       return ret;
>   }
>   
> +
> +static void
> +libxlReconnectNotifyNets(virDomainDefPtr def)
> +{
> +    size_t i;
> +    virConnectPtr conn = NULL;
> +
> +    for (i = 0; i < def->nnets; i++) {
> +        virDomainNetDefPtr net = def->nets[i];
> +        /* keep others from trying to use the macvtap device name, but
> +         * don't return error if this happens, since that causes the
> +         * domain to be unceremoniously killed, which would be *very*
> +         * impolite.
> +         */
> +        if (virDomainNetGetActualType(net) == VIR_DOMAIN_NET_TYPE_DIRECT)
> +           ignore_value(virNetDevMacVLanReserveName(net->ifname, false));
> +
> +        if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK) {
> +            if (!conn && !(conn = virGetConnectNetwork()))
> +                continue;
> +            virDomainNetNotifyActualDevice(conn, def, net);
> +        }
> +    }
> +
> +    virObjectUnref(conn);
> +}
> +
> +
>   /*
>    * Reconnect to running domains that were previously started/created
>    * with libxenlight driver.
> @@ -424,6 +452,8 @@ libxlReconnectDomain(virDomainObjPtr vm,
>       /* Enable domain death events */
>       libxl_evenable_domain_death(cfg->ctx, vm->def->id, 0, &priv->deathW);
>   
> +    libxlReconnectNotifyNets(vm->def);
> +
>       /* now that we know it's reconnected call the hook if present */
>       if (virHookPresent(VIR_HOOK_DRIVER_LIBXL) &&
>           STRNEQ("Domain-0", vm->def->name)) {
> diff --git a/src/lxc/lxc_process.c b/src/lxc/lxc_process.c
> index de4d7c73fb..b59cbbaba5 100644
> --- a/src/lxc/lxc_process.c
> +++ b/src/lxc/lxc_process.c
> @@ -1646,6 +1646,34 @@ virLXCProcessAutostartAll(virLXCDriverPtr driver)
>       virObjectUnref(conn);
>   }
>   
> +
> +static void
> +virLXCProcessReconnectNotifyNets(virDomainDefPtr def)
> +{
> +    size_t i;
> +    virConnectPtr conn = NULL;
> +
> +    for (i = 0; i < def->nnets; i++) {
> +        virDomainNetDefPtr net = def->nets[i];
> +        /* keep others from trying to use the macvtap device name, but
> +         * don't return error if this happens, since that causes the
> +         * domain to be unceremoniously killed, which would be *very*
> +         * impolite.
> +         */
> +        if (virDomainNetGetActualType(net) == VIR_DOMAIN_NET_TYPE_DIRECT)
> +           ignore_value(virNetDevMacVLanReserveName(net->ifname, false));
> +
> +        if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK) {
> +            if (!conn && !(conn = virGetConnectNetwork()))
> +                continue;
> +            virDomainNetNotifyActualDevice(conn, def, net);
> +        }
> +    }
> +
> +    virObjectUnref(conn);
> +}
> +
> +
>   static int
>   virLXCProcessReconnectDomain(virDomainObjPtr vm,
>                                void *opaque)
> @@ -1692,6 +1720,8 @@ virLXCProcessReconnectDomain(virDomainObjPtr vm,
>                                              vm->def, vm->pid) < 0)
>               goto error;
>   
> +        virLXCProcessReconnectNotifyNets(vm->def);
> +
>           /* now that we know it's reconnected call the hook if present */
>           if (virHookPresent(VIR_HOOK_DRIVER_LXC)) {
>               char *xml = virDomainDefFormat(vm->def, driver->caps, 0);





More information about the libvir-list mailing list