]> xenbits.xensource.com Git - libvirt.git/commitdiff
virNetDevMacVLanCreateWithVPortProfile: Rework to support multiple FDs
authorMichal Privoznik <mprivozn@redhat.com>
Fri, 4 Dec 2015 10:31:17 +0000 (11:31 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Fri, 11 Dec 2015 07:44:43 +0000 (08:44 +0100)
For the multiqueue on macvtaps we are going to need to open
the device multiple times. Currently, this is not supported.
Rework the function, so that upper layers can be reworked too.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
src/lxc/lxc_process.c
src/qemu/qemu_command.c
src/util/virnetdevmacvlan.c
src/util/virnetdevmacvlan.h

index 0ada6e4021de2b326c6e26404c98d457a93cdfdb..f7e2b810b74b8f440ac65269b8d506dc4f85e037 100644 (file)
@@ -349,6 +349,7 @@ char *virLXCProcessSetupInterfaceDirect(virConnectPtr conn,
             &res_ifname,
             VIR_NETDEV_VPORT_PROFILE_OP_CREATE,
             cfg->stateDir,
+            NULL, 0,
             macvlan_create_flags) < 0)
         goto cleanup;
 
index b1febede410520be793b7dc34b35dc8c0c675947..d856377489e1737658aa1d218926c91b250993d7 100644 (file)
@@ -230,15 +230,18 @@ qemuPhysIfaceConnect(virDomainDefPtr def,
     if (net->model && STREQ(net->model, "virtio"))
         macvlan_create_flags |= VIR_NETDEV_MACVLAN_VNET_HDR;
 
-    rc = virNetDevMacVLanCreateWithVPortProfile(
-        net->ifname, &net->mac,
-        virDomainNetGetActualDirectDev(net),
-        virDomainNetGetActualDirectMode(net),
-        def->uuid,
-        virDomainNetGetActualVirtPortProfile(net),
-        &res_ifname,
-        vmop, cfg->stateDir,
-        macvlan_create_flags);
+    if (virNetDevMacVLanCreateWithVPortProfile(net->ifname,
+                                               &net->mac,
+                                               virDomainNetGetActualDirectDev(net),
+                                               virDomainNetGetActualDirectMode(net),
+                                               def->uuid,
+                                               virDomainNetGetActualVirtPortProfile(net),
+                                               &res_ifname,
+                                               vmop, cfg->stateDir,
+                                               &rc, 1,
+                                               macvlan_create_flags) < 0)
+        return -1;
+
     if (rc >= 0) {
         virDomainAuditNetDevice(def, net, res_ifname, true);
         VIR_FREE(net->ifname);
index 191d0b867639dfc92dfa449a2e04a20fa64fb9bf..d8d1d901f922e7cbd40d61ac78dce3c7793d983b 100644 (file)
@@ -727,11 +727,15 @@ virNetDevMacVLanVPortProfileRegisterCallback(const char *ifname,
  * @res_ifname: Pointer to a string pointer where the actual name of the
  *     interface will be stored into if everything succeeded. It is up
  *     to the caller to free the string.
+ * @tapfd: array of file descriptor return value for the new tap device
+ * @tapfdSize: number of file descriptors in @tapfd
  * @flags: OR of virNetDevMacVLanCreateFlags.
  *
- * Returns file descriptor of the tap device in case of success with
- * @flags & VIR_NETDEV_MACVLAN_CREATE_WITH_TAP, otherwise returns 0; returns
- * -1 on error.
+ * Creates a macvlan device. Optionally, if flags &
+ * VIR_NETDEV_MACVLAN_CREATE_WITH_TAP is set, @tapfd is populated with FDs of
+ * tap devices up to @tapfdSize.
+ *
+ * Return 0 on success, -1 on error.
  */
 int virNetDevMacVLanCreateWithVPortProfile(const char *tgifname,
                                            const virMacAddr *macaddress,
@@ -742,6 +746,8 @@ int virNetDevMacVLanCreateWithVPortProfile(const char *tgifname,
                                            char **res_ifname,
                                            virNetDevVPortProfileOp vmOp,
                                            char *stateDir,
+                                           int *tapfd,
+                                           size_t tapfdSize,
                                            unsigned int flags)
 {
     const char *type = (flags & VIR_NETDEV_MACVLAN_CREATE_WITH_TAP) ?
@@ -853,10 +859,10 @@ int virNetDevMacVLanCreateWithVPortProfile(const char *tgifname,
     }
 
     if (flags & VIR_NETDEV_MACVLAN_CREATE_WITH_TAP) {
-        if (virNetDevMacVLanTapOpen(cr_ifname, &rc, 1, 10) < 0)
+        if (virNetDevMacVLanTapOpen(cr_ifname, tapfd, tapfdSize, 10) < 0)
             goto disassociate_exit;
 
-        if (virNetDevMacVLanTapSetup(&rc, 1, vnet_hdr, false) < 0) {
+        if (virNetDevMacVLanTapSetup(tapfd, tapfdSize, vnet_hdr, tapfdSize > 0) < 0) {
             VIR_FORCE_CLOSE(rc); /* sets rc to -1 */
             goto disassociate_exit;
         }
@@ -892,6 +898,8 @@ int virNetDevMacVLanCreateWithVPortProfile(const char *tgifname,
                                                    linkdev,
                                                    vf,
                                                    vmOp));
+    while (tapfdSize--)
+        VIR_FORCE_CLOSE(tapfd[tapfdSize]);
 
  link_del_exit:
     ignore_value(virNetDevMacVLanDelete(cr_ifname));
@@ -1016,6 +1024,8 @@ int virNetDevMacVLanCreateWithVPortProfile(const char *ifname ATTRIBUTE_UNUSED,
                                            char **res_ifname ATTRIBUTE_UNUSED,
                                            virNetDevVPortProfileOp vmop ATTRIBUTE_UNUSED,
                                            char *stateDir ATTRIBUTE_UNUSED,
+                                           int *tapfd ATTRIBUTE_UNUSED,
+                                           size_t tapfdSize ATTRIBUTE_UNUSED,
                                            unsigned int unused_flags ATTRIBUTE_UNUSED)
 {
     virReportSystemError(ENOSYS, "%s",
index 0613f4d78fe19d73c6824be01b544ee839797f8f..2844a449ba842be1132da067e0e7e0f2615d9a38 100644 (file)
@@ -71,9 +71,11 @@ int virNetDevMacVLanCreateWithVPortProfile(const char *ifname,
                                            char **res_ifname,
                                            virNetDevVPortProfileOp vmop,
                                            char *stateDir,
+                                           int *tapfd,
+                                           size_t tapfdSize,
                                            unsigned int flags)
     ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(6)
-    ATTRIBUTE_NONNULL(8) ATTRIBUTE_NONNULL(10) ATTRIBUTE_RETURN_CHECK;
+    ATTRIBUTE_NONNULL(8) ATTRIBUTE_NONNULL(12) ATTRIBUTE_RETURN_CHECK;
 
 int virNetDevMacVLanDeleteWithVPortProfile(const char *ifname,
                                            const virMacAddr *macaddress,