Daniel P. Berrange wrote:
On Mon, Feb 24, 2014 at 11:12:33PM +0400, Roman Bogorodskiy wrote:
> We have to explicitly destroy TAP devices on FreeBSD because
> they're not freed after being closed, otherwise we end up with
> orphaned TAP devices after destroying a domain.
> ---
> src/qemu/qemu_process.c | 7 +++++++
> 1 file changed, 7 insertions(+)
>
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index ffa939a..9181423 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -61,6 +61,7 @@
> #include "viruuid.h"
> #include "virprocess.h"
> #include "virtime.h"
> +#include "virnetdevbridge.h"
> #include "virnetdevtap.h"
> #include "virbitmap.h"
> #include "viratomic.h"
> @@ -4381,6 +4382,12 @@ void qemuProcessStop(virQEMUDriverPtr driver,
> virDomainNetGetActualVirtPortProfile(net),
> cfg->stateDir));
> VIR_FREE(net->ifname);
> + } else if (virDomainNetGetActualType(net) == VIR_DOMAIN_NET_TYPE_BRIDGE) {
> + /* On some OSes, e.g. FreeBSD, tap devices are not cleaned up when
released,
> + * so we have to handle that manually */
> +
ignore_value(virNetDevBridgeRemovePort(virDomainNetGetActualBridgeName(net),
> + net->ifname));
> + ignore_value(virNetDevTapDelete(net->ifname));
> }
> /* release the physical device (or any other resources used by
> * this interface in the network driver
Conceptually ok, but I fear this impl will result in the logs getting
polluted with "cannot delete tap device" or similar log messages on OS
where TAP device deletion is automatic.
Do you have an idea about better way to do that?
Maybe we could create something opposite to
virNetDevTapCreateInBridgePort(), e.g.
virNetDevTapReleaseInBridgePort() which would destroy tap device on
FreeBSD and do nothing on Linux?
But that will still require platform specific #ifdef's because checking
tap releasing feels like a little out of scope of configure checks.
Roman Bogorodskiy