]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: cleanup tap devices on FreeBSD
authorRoman Bogorodskiy <bogorodskiy@gmail.com>
Tue, 11 Mar 2014 07:17:26 +0000 (11:17 +0400)
committerMichal Privoznik <mprivozn@redhat.com>
Fri, 14 Mar 2014 14:45:51 +0000 (15:45 +0100)
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
src/util/virnetdevtap.h

index 809ab3732bc9946becb874c9f4346592ea6fce68..78725bd32f3e8c53846cde605e331a85151f4490 100644 (file)
@@ -4375,7 +4375,10 @@ void qemuProcessStop(virQEMUDriverPtr driver,
     def = vm->def;
     for (i = 0; i < def->nnets; i++) {
         virDomainNetDefPtr net = def->nets[i];
-        if (virDomainNetGetActualType(net) == VIR_DOMAIN_NET_TYPE_DIRECT) {
+        vport = virDomainNetGetActualVirtPortProfile(net);
+
+        switch (virDomainNetGetActualType(net)) {
+        case VIR_DOMAIN_NET_TYPE_DIRECT:
             ignore_value(virNetDevMacVLanDeleteWithVPortProfile(
                              net->ifname, &net->mac,
                              virDomainNetGetActualDirectDev(net),
@@ -4383,11 +4386,18 @@ void qemuProcessStop(virQEMUDriverPtr driver,
                              virDomainNetGetActualVirtPortProfile(net),
                              cfg->stateDir));
             VIR_FREE(net->ifname);
+            break;
+        case VIR_DOMAIN_NET_TYPE_BRIDGE:
+        case VIR_DOMAIN_NET_TYPE_NETWORK:
+#ifdef VIR_NETDEV_TAP_REQUIRE_MANUAL_CLEANUP
+            if (!(vport && vport->virtPortType == VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH))
+                ignore_value(virNetDevTapDelete(net->ifname));
+#endif
+            break;
         }
         /* release the physical device (or any other resources used by
          * this interface in the network driver
          */
-        vport = virDomainNetGetActualVirtPortProfile(net);
         if (vport && vport->virtPortType == VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH)
             ignore_value(virNetDevOpenvswitchRemovePort(
                                        virDomainNetGetActualBridgeName(net),
index a762b312d80f13a232b7ec9db3b47acfdd14911f..1e5bd19d25a8ba76cdf7360e5cd85de5c77f5f90 100644 (file)
 # include "virnetdevvportprofile.h"
 # include "virnetdevvlan.h"
 
+# ifdef __FreeBSD__
+/* This should be defined on OSes that don't automatically
+ * cleanup released devices */
+#  define VIR_NETDEV_TAP_REQUIRE_MANUAL_CLEANUP 1
+# endif
+
 int virNetDevTapCreate(char **ifname,
                        int *tapfd,
                        int tapfdSize,