[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