[libvirt] [PATCH] Add support for 'passthru' mode for direct network interfaces
Daniel Veillard
veillard at redhat.com
Wed May 18 08:53:05 UTC 2011
On Tue, May 17, 2011 at 08:19:17PM -0600, Eric Blake wrote:
> On 05/17/2011 05:26 AM, D. Herrendoerfer wrote:
> > This patch includes the documentation part.
> >
> > The error returned by libvirt when a using an older kernel
> > is imho sufficient to point to the macvtap setup. Apart from that
> > I doubt that someone will use this feature by chance. But still - I
> > believe the error returned is detailed enough for now.
>
> Fair enough for me.
>
> Your patch came through rather mangled by your mailer; sometimes, it is
> worth sending a patch to yourself as a trial run to see if others would
> have a hard time running 'git am' on the resulting email, then figure
> out how to tune 'git send-email' to do what you wanted for sending the
> patch. The git mailing list or IRC channel is a good resource for
> figuring out configuration emails that make patch submission easier.
>
> >
> > Signed-off-by: Dirk Herrendoerfer <d.herrendoerfer at herrendoerfer.name>
> >
> > diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
> > index 989dcf6..3f6bec8 100644
> > --- a/docs/formatdomain.html.in
> > +++ b/docs/formatdomain.html.in
> > @@ -1429,6 +1429,12 @@
> > external router or gateway and that device sends them back to the
> > host. This procedure is followed if either the source or destination
> > device is in <code>private</code> mode.</dd>
> > + <dt><code>passthru</code></dt>
> > + <dd>This feature allows to attach a virtual function of a SRIOV
> > capable
>
> s/allows to attach/attaches/
>
> > + NIC directly to a VM without loosing the migration capability.
>
> s/loosing/losing/
>
> > + All packets are sent to the VF/IF of the configured network device.
> > + Depending on the capabilities of the device additional
> > prerequisites or
> > + limitations may apply. <span class="since">(Since Linux
> > 2.6.38.)</span></dd>
>
> Here's where part of the patch botching showed up. Also, when possible,
> we like to keep lines within 80 columns.
>
> The <span class="since"> annotations are for when a feature was added to
> libvirt (0.9.2 in this case), not when it was added elsewhere.
>
> > </dl>
> >
> > <pre>
> > diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng
> > index 7163c6e..e2a66ae 100644
> > --- a/docs/schemas/domain.rng
> > +++ b/docs/schemas/domain.rng
> > @@ -2351,7 +2351,7 @@
> > </define>
> > <define name="bridgeMode">
> > <data type="string">
> > - <param name="pattern">(vepa|bridge|private)</param>
> > + <param name="pattern">(vepa|bridge|private|passthru)</param>
>
> We already have other cases of "passthrough" in our XML schema; let's be
> consistent and avoid abbreviations in the public interface.
>
> > </data>
> > </define>
> > <define name="addrMAC">
> > diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> > index d3efec6..4c4bfad 100644
> > --- a/src/conf/domain_conf.c
> > +++ b/src/conf/domain_conf.c
> > @@ -383,7 +383,8 @@ VIR_ENUM_IMPL(virDomainSeclabel,
> > VIR_DOMAIN_SECLABEL_LAST,
> > VIR_ENUM_IMPL(virDomainNetdevMacvtap, VIR_DOMAIN_NETDEV_MACVTAP_MODE_LAST,
> > "vepa",
> > "private",
> > - "bridge")
> > + "bridge",
> > + "passthru" )
>
> Odd spacing, and same spelling issue.
>
> >
> > VIR_ENUM_IMPL(virVirtualPort, VIR_VIRTUALPORT_TYPE_LAST,
> > "none",
> > diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> > index a0f820c..70943f9 100644
> > --- a/src/conf/domain_conf.h
> > +++ b/src/conf/domain_conf.h
> > @@ -335,6 +335,7 @@ enum virDomainNetdevMacvtapType {
> > VIR_DOMAIN_NETDEV_MACVTAP_MODE_VEPA,
> > VIR_DOMAIN_NETDEV_MACVTAP_MODE_PRIVATE,
> > VIR_DOMAIN_NETDEV_MACVTAP_MODE_BRIDGE,
> > + VIR_DOMAIN_NETDEV_MACVTAP_MODE_PASSTHRU,
>
> But here, the abbreviation is fine (it's internal to the code).
>
> >
> > VIR_DOMAIN_NETDEV_MACVTAP_MODE_LAST,
> > };
> > diff --git a/src/util/macvtap.c b/src/util/macvtap.c
> > index a7af0cb..1b274cc 100644
> > --- a/src/util/macvtap.c
> > +++ b/src/util/macvtap.c
> > @@ -473,6 +473,9 @@ macvtapModeFromInt(enum virDomainNetdevMacvtapType
> > mode)
> > case VIR_DOMAIN_NETDEV_MACVTAP_MODE_BRIDGE:
> > return MACVLAN_MODE_BRIDGE;
> >
> > + case VIR_DOMAIN_NETDEV_MACVTAP_MODE_PASSTHRU:
> > + return MACVLAN_MODE_PASSTHRU;
>
> This fails to compile for me on kernel-2.6.35.13-91.fc14.x86_64, but I
> see on rawhide that this is 8, so we need a #define fallback value.
> Shoot, in rawhide, it's an enum rather than a #define, so we need a
> configure check rather than a simpler preprocessor check.
>
> This is what I'll probably push.
>
>
> From f977a09221757826ee91dd966e8d726b0bc22501 Mon Sep 17 00:00:00 2001
> From: Dirk Herrendorefer <d.herrendoerfer at herrendoerfer.name>
> Date: Tue, 17 May 2011 13:26:09 +0200
> Subject: [PATCH] Add support for 'passthru' mode for direct network
> interfaces
>
> starting with kernel 2.6.38 macvtap supports a 'passthru' mode for
> attaching virtual functions of a SRIOV capable network card directly to
> a VM.
> This patch adds the capability to configure such a device.
>
> Signed-off-by: Dirk Herrendoerfer <d.herrendoerfer at herrendoerfer.name>
> ---
> AUTHORS | 1 +
> configure.ac | 7 +++++++
> docs/formatdomain.html.in | 7 +++++++
> docs/schemas/domain.rng | 2 +-
> src/conf/domain_conf.c | 3 ++-
> src/conf/domain_conf.h | 1 +
> src/util/macvtap.c | 12 ++++++++++--
> src/util/macvtap.h | 1 +
> 8 files changed, 30 insertions(+), 4 deletions(-)
>
> diff --git a/AUTHORS b/AUTHORS
> index 1bb1f0f..a1e93db 100644
> --- a/AUTHORS
> +++ b/AUTHORS
> @@ -170,6 +170,7 @@ Patches have also been contributed by:
> index 233e4af..8db3226 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -2240,6 +2240,13 @@ if test "$with_macvtap" != "no" ; then
> fi
> AM_CONDITIONAL([WITH_MACVTAP], [test "$with_macvtap" = "yes"])
> AC_MSG_RESULT([$with_macvtap])
> +if test "$with_macvtap" = yes; then
> + AC_CHECK_DECLS([MACVLAN_MODE_PASSTHRU], [], [], [[
> + #include <sys/socket.h>
> + #include <linux/if_link.h>
> + ]])
> +fi
> +
>
> AC_ARG_WITH([virtualport],
> AC_HELP_STRING([--with-virtualport],[enable virtual port support
> @<:@default=check@:>@]),
> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
> index 989dcf6..70a120b 100644
> --- a/docs/formatdomain.html.in
> +++ b/docs/formatdomain.html.in
> @@ -1429,6 +1429,13 @@
> external router or gateway and that device sends them back to the
> host. This procedure is followed if either the source or destination
> device is in <code>private</code> mode.</dd>
> + <dt><code>passthru</code></dt>
> + <dd>This feature attaches a virtual function of a SRIOV capable
> + NIC directly to a VM without losing the migration capability.
> + All packets are sent to the VF/IF of the configured network device.
> + Depending on the capabilities of the device additional
> prerequisites or
> + limitations may apply; for example, on Linux this requires
> + kernel 2.6.38 or newer. <span class="since">Since 0.9.2</span></dd>
> </dl>
>
> <pre>
> diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng
> index 7163c6e..b252547 100644
> --- a/docs/schemas/domain.rng
> +++ b/docs/schemas/domain.rng
> @@ -2351,7 +2351,7 @@
> </define>
> <define name="bridgeMode">
> <data type="string">
> - <param name="pattern">(vepa|bridge|private)</param>
> + <param name="pattern">(vepa|bridge|private|passthrough)</param>
> </data>
> </define>
> <define name="addrMAC">
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 498438a..3298c80 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -433,7 +433,8 @@ VIR_ENUM_IMPL(virDomainSeclabel,
> VIR_DOMAIN_SECLABEL_LAST,
> VIR_ENUM_IMPL(virDomainNetdevMacvtap, VIR_DOMAIN_NETDEV_MACVTAP_MODE_LAST,
> "vepa",
> "private",
> - "bridge")
> + "bridge",
> + "passthrough")
>
> VIR_ENUM_IMPL(virVirtualPort, VIR_VIRTUALPORT_TYPE_LAST,
> "none",
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index fe42f21..5fe31d4 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -335,6 +335,7 @@ enum virDomainNetdevMacvtapType {
> VIR_DOMAIN_NETDEV_MACVTAP_MODE_VEPA,
> VIR_DOMAIN_NETDEV_MACVTAP_MODE_PRIVATE,
> VIR_DOMAIN_NETDEV_MACVTAP_MODE_BRIDGE,
> + VIR_DOMAIN_NETDEV_MACVTAP_MODE_PASSTHRU,
>
> VIR_DOMAIN_NETDEV_MACVTAP_MODE_LAST,
> };
> diff --git a/src/util/macvtap.c b/src/util/macvtap.c
> index a7af0cb..068638e 100644
> --- a/src/util/macvtap.c
> +++ b/src/util/macvtap.c
> @@ -1,5 +1,5 @@
> /*
> - * Copyright (C) 2010 Red Hat, Inc.
> + * Copyright (C) 2010-2011 Red Hat, Inc.
> * Copyright (C) 2010 IBM Corporation
> *
> * This library is free software; you can redistribute it and/or
> @@ -45,6 +45,11 @@
>
> # include <netlink/msg.h>
>
> +/* Older kernels lacked this enum value. */
> +# if !HAVE_DECL_MACVLAN_MODE_PASSTHRU
> +# define MACVLAN_MODE_PASSTHRU 8
> +# endif
> +
> #endif /* WITH_MACVTAP || WITH_VIRTUALPORT */
>
> #include "util.h"
> @@ -473,6 +478,9 @@ macvtapModeFromInt(enum virDomainNetdevMacvtapType mode)
> case VIR_DOMAIN_NETDEV_MACVTAP_MODE_BRIDGE:
> return MACVLAN_MODE_BRIDGE;
>
> + case VIR_DOMAIN_NETDEV_MACVTAP_MODE_PASSTHRU:
> + return MACVLAN_MODE_PASSTHRU;
> +
> case VIR_DOMAIN_NETDEV_MACVTAP_MODE_VEPA:
> default:
> return MACVLAN_MODE_VEPA;
> @@ -546,7 +554,7 @@ configMacvtapTap(int tapfd, int vnet_hdr)
> * be NULL if this function is supposed to choose a name
> * @macaddress: The MAC address for the macvtap device
> * @linkdev: The interface name of the NIC to connect to the external
> bridge
> - * @mode: int describing the mode for 'bridge', 'vepa' or 'private'.
> + * @mode: int describing the mode for 'bridge', 'vepa', 'private' or
> 'passthru'.
> * @vnet_hdr: 1 to enable IFF_VNET_HDR, 0 to disable it
> * @vmuuid: The UUID of the VM the macvtap belongs to
> * @virtPortProfile: pointer to object holding the virtual port profile
> data
> diff --git a/src/util/macvtap.h b/src/util/macvtap.h
> index 54205c7..c45dd13 100644
> --- a/src/util/macvtap.h
> +++ b/src/util/macvtap.h
> @@ -92,6 +92,7 @@ void delMacvtap(const char *ifname,
> # define MACVTAP_MODE_PRIVATE_STR "private"
> # define MACVTAP_MODE_VEPA_STR "vepa"
> # define MACVTAP_MODE_BRIDGE_STR "bridge"
> +# define MACVTAP_MODE_PASSTHRU_STR "passthru"
>
> int vpAssociatePortProfileId(const char *macvtap_ifname,
> const unsigned char *macvtap_macaddr,
That patch looks fine to me, ACK,
The only unresolved uncertainty to me is what happen if you try to use
it on a kernel without the support ?
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
daniel at veillard.com | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library http://libvirt.org/
More information about the libvir-list
mailing list