[libvirt] [PATCH 5/6] virNetDevMacVLanCreateWithVPortProfile: Rework to support multiple FDs

Laine Stump laine at laine.org
Fri Dec 4 17:51:40 UTC 2015


On 12/04/2015 07:31 AM, Michal Privoznik wrote:
> So, 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 at redhat.com>
> ---

I don't see any extra value (beyond review-time :-) in having this patch 
separated from the previous 2. I think they could just as well be 
combined into a single patch, leaving only the top-level enablement in 
the qemu driver as a separate patch (as well as patches 1 and 2, since 
they aren't purely adding in the multi-fd support.)

ACK for what's here, however it gets pushed.

>   src/lxc/lxc_process.c       |  1 +
>   src/qemu/qemu_command.c     | 21 ++++++++++++---------
>   src/util/virnetdevmacvlan.c | 18 +++++++++++++-----
>   src/util/virnetdevmacvlan.h |  4 +++-
>   4 files changed, 29 insertions(+), 15 deletions(-)
>
> diff --git a/src/lxc/lxc_process.c b/src/lxc/lxc_process.c
> index 0ada6e4..f7e2b81 100644
> --- a/src/lxc/lxc_process.c
> +++ b/src/lxc/lxc_process.c
> @@ -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;
>   
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 55809e9..d1ef4ab 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -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);
> diff --git a/src/util/virnetdevmacvlan.c b/src/util/virnetdevmacvlan.c
> index f7a7d72..244e01a 100644
> --- a/src/util/virnetdevmacvlan.c
> +++ b/src/util/virnetdevmacvlan.c
> @@ -739,11 +739,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,
> @@ -754,6 +758,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) ?
> @@ -865,10 +871,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) < 0) {
> +        if (virNetDevMacVLanTapSetup(tapfd, tapfdSize, vnet_hdr) < 0) {
>               VIR_FORCE_CLOSE(rc); /* sets rc to -1 */
>               goto disassociate_exit;
>           }
> @@ -1028,6 +1034,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",
> diff --git a/src/util/virnetdevmacvlan.h b/src/util/virnetdevmacvlan.h
> index b04fc8c..08ccdd2 100644
> --- a/src/util/virnetdevmacvlan.h
> +++ b/src/util/virnetdevmacvlan.h
> @@ -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,




More information about the libvir-list mailing list