[libvirt] [PATCH 2/3] qemu: add a qemuInterfaceStopDevices(), called when guest CPUs stop

Matthew Rosato mjrosato at linux.vnet.ibm.com
Fri Dec 12 19:25:35 UTC 2014


On 12/12/2014 11:34 AM, Laine Stump wrote:
> We now have a qemuInterfaceStartDevices() which does the final
> activation needed for the host-side tap/macvtap devices that are used
> for qemu network connections. It will soon make sense to have the
> converse qemuInterfaceStopDevices() which will undo whatever was done
> during qemuInterfaceStartDevices().
> 
> A function to "stop" a single device has also been added, and is
> called from the appropriate place in qemuDomainDetachNetDevice(),
> although this is currently unnecessary - the device is going to
> immediately be deleted anyway, so any extra "deactivation" will be for
> naught. The call is included for completeness, though, in anticipation
> that in the future there may be some required action that *isn't*
> nullified by deleting the device.
> 
> This patch is a part of a more complete fix for:
> 
>   https://bugzilla.redhat.com/show_bug.cgi?id=1081461
> ---
>  src/qemu/qemu_hotplug.c   |  8 ++++++
>  src/qemu/qemu_interface.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++
>  src/qemu/qemu_interface.h |  2 ++
>  src/qemu/qemu_process.c   |  3 +++
>  4 files changed, 79 insertions(+)
> 
> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
> index 8c0642e..e56cffe 100644
> --- a/src/qemu/qemu_hotplug.c
> +++ b/src/qemu/qemu_hotplug.c
> @@ -3513,6 +3513,14 @@ qemuDomainDetachNetDevice(virQEMUDriverPtr driver,
>          VIR_WARN("cannot clear bandwidth setting for device : %s",
>                   detach->ifname);
> 
> +    /* deactivate the tap/macvtap device on the host (currently this
> +     * isn't necessary, as everything done in
> +     * qemuInterfaceStopDevice() is made meaningless when the device
> +     * is deleted anyway, but in the future it may be important, and
> +     * doesn't hurt anything for now)
> +     */
> +    ignore_value(qemuInterfaceStopDevice(detach));
> +
>      qemuDomainMarkDeviceForRemoval(vm, &detach->info);
> 
>      qemuDomainObjEnterMonitor(driver, vm);
> diff --git a/src/qemu/qemu_interface.c b/src/qemu/qemu_interface.c
> index b0f0c5d..b9694c8 100644
> --- a/src/qemu/qemu_interface.c
> +++ b/src/qemu/qemu_interface.c
> @@ -98,3 +98,69 @@ qemuInterfaceStartDevices(virDomainDefPtr def)
>      }
>      return 0;
>  }
> +
> +
> +/**
> + * qemuInterfaceStopDevice:
> + * @net: net device to stop
> + *
> + * Based upon the type of device provided, perform the appropriate
> + * work to deactivate the device so that packets aren't forwarded to
> + * it from the rest of the network.
> + */
> +int
> +qemuInterfaceStopDevice(virDomainNetDefPtr net)
> +{
> +    int ret = -1;
> +
> +    switch (virDomainNetGetActualType(net)) {
> +    case VIR_DOMAIN_NET_TYPE_BRIDGE:
> +    case VIR_DOMAIN_NET_TYPE_NETWORK:
> +        break;
> +
> +    case VIR_DOMAIN_NET_TYPE_DIRECT:
> +        /* macvtap interfaces need to be marked !IFF_UP (ie "down") to
> +         * prevent any host-generated traffic sent from this interface
> +         * from putting bad info into the arp caches of other machines
> +         * on this network.
> +         */
> +        if (virNetDevSetOnline(net->ifname, false) < 0)
> +            goto cleanup;
> +        break;
> +
> +    case VIR_DOMAIN_NET_TYPE_USER:
> +    case VIR_DOMAIN_NET_TYPE_ETHERNET:
> +    case VIR_DOMAIN_NET_TYPE_VHOSTUSER:
> +    case VIR_DOMAIN_NET_TYPE_SERVER:
> +    case VIR_DOMAIN_NET_TYPE_CLIENT:
> +    case VIR_DOMAIN_NET_TYPE_MCAST:
> +    case VIR_DOMAIN_NET_TYPE_INTERNAL:
> +    case VIR_DOMAIN_NET_TYPE_HOSTDEV:
> +    case VIR_DOMAIN_NET_TYPE_LAST:
> +        /* these types all require no action */
> +        break;
> +    }
> +
> +    ret = 0;
> + cleanup:
> +    return ret;
> +}
> +
> +/**
> + * qemuInterfaceStopDevices:
> + * @def: domain definition
> + *
> + * Make all interfaces associated with this domain inaccessible from
> + * the rest of the network.
> + */
> +int
> +qemuInterfaceStopDevices(virDomainDefPtr def)
> +{
> +    size_t i;
> +
> +    for (i = 0; i < def->nnets; i++) {
> +        if (qemuInterfaceStopDevice(def->nets[i]) < 0)
> +            return -1;
> +    }
> +    return 0;
> +}
> diff --git a/src/qemu/qemu_interface.h b/src/qemu/qemu_interface.h
> index d040f52..b4c1efc 100644
> --- a/src/qemu/qemu_interface.h
> +++ b/src/qemu/qemu_interface.h
> @@ -28,5 +28,7 @@
> 
>  int qemuInterfaceStartDevice(virDomainNetDefPtr net);
>  int qemuInterfaceStartDevices(virDomainDefPtr def);
> +int qemuInterfaceStopDevice(virDomainNetDefPtr net);
> +int qemuInterfaceStopDevices(virDomainDefPtr def);
> 
>  #endif /* __QEMU_INTERFACE_H__ */
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index 0028283..a19e71a 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -3182,6 +3182,9 @@ int qemuProcessStopCPUs(virQEMUDriverPtr driver,
>      if (ret < 0)
>          goto cleanup;
> 
> +    /* de-activate netdevs after stopping CPUs */
> +    ignore_value(qemuInterfaceStopDevices(vm->def));
> +
>      if (priv->job.current)
>          ignore_value(virTimeMillisNow(&priv->job.current->stopped));
> 

Reviewed by: Matthew Rosato <mjrosato at linux.vnet.ibm.com>




More information about the libvir-list mailing list