[libvirt] [PATCH v2 5/7] virNetDevMacVLanTapSetup: Allow enabling of IFF_MULTI_QUEUE

Ian Campbell ian.campbell at citrix.com
Mon Dec 14 10:23:59 UTC 2015


Hello,

On Thu, 2015-12-10 at 08:38 +0100, Michal Privoznik wrote:
> Like we are doing for TUN/TAP devices, we should do the same for
> macvtaps. Although, it's not as critical as in that case, we
> should do it for the consistency.
> 
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>

This has triggered a build failure on amd64+i386+armhf within the Xen
automated test framework (which uses Debian Wheezy as the build
environment), I doubt it is in any way Xen specific though:

util/virnetdevmacvlan.c: In function 'virNetDevMacVLanTapSetup':
util/virnetdevmacvlan.c:338:26: error: 'IFF_MULTI_QUEUE' undeclared (first use in this function)
util/virnetdevmacvlan.c:338:26: note: each undeclared identifier is reported only once for each function it appears in

I'm not sure where that definition is supposed to come from, so I can't
tell if it is a missing #include in this code or an out of date header on
the Debian system.

Full logs are at
http://logs.test-lab.xenproject.org/osstest/logs/65756/
http://logs.test-lab.xenproject.org/osstest/logs/65756/build-amd64-libvirt/5.ts-libvirt-build.log
http://lists.xen.org/archives/html/xen-devel/2015-12/msg01470.html

But TBH there isn't much more of use than the above.

Cheers,
Ian.

> ---
>  src/util/virnetdevmacvlan.c | 40 ++++++++++++++++++++++-----------------
> -
>  1 file changed, 22 insertions(+), 18 deletions(-)
> 
> diff --git a/src/util/virnetdevmacvlan.c b/src/util/virnetdevmacvlan.c
> index c4d0d53..76fd542 100644
> --- a/src/util/virnetdevmacvlan.c
> +++ b/src/util/virnetdevmacvlan.c
> @@ -289,24 +289,26 @@ virNetDevMacVLanTapOpen(const char *ifname,
>   * @tapfd: array of file descriptors of the macvtap tap
>   * @tapfdSize: number of file descriptors in @tapfd
>   * @vnet_hdr: whether to enable or disable IFF_VNET_HDR
> + * @multiqueue: whether to enable or disable IFF_MULTI_QUEUE
> + *
> + * Turn the IFF_VNET_HDR flag, if requested and available, make sure
> it's
> + * off in the other cases. Similarly, IFF_MULTI_QUEUE is enabled if
> + * requested. However, if requested and failed to set, it is considered
> a
> + * fatal error (as opposed to @vnet_hdr).
>   *
> - * Turn the IFF_VNET_HDR flag, if requested and available, make sure
> - * it's off in the other cases.
>   * A fatal error is defined as the VNET_HDR flag being set but it cannot
>   * be turned off for some reason. This is reported with -1. Other fatal
>   * error is not being able to read the interface flags. In that case the
>   * macvtap device should not be used.
>   *
> - * Returns 0 on success, -1 in case of fatal error, error code
> otherwise.
> + * Returns 0 on success, -1 in case of fatal error.
>   */
>  static int
> -virNetDevMacVLanTapSetup(int *tapfd, size_t tapfdSize, bool vnet_hdr)
> +virNetDevMacVLanTapSetup(int *tapfd, size_t tapfdSize, bool vnet_hdr,
> bool multiqueue)
>  {
>      unsigned int features;
>      struct ifreq ifreq;
>      short new_flags = 0;
> -    int rc_on_fail = 0;
> -    const char *errmsg = NULL;
>      size_t i;
>  
>      for (i = 0; i < tapfdSize; i++) {
> @@ -320,27 +322,29 @@ virNetDevMacVLanTapSetup(int *tapfd, size_t
> tapfdSize, bool vnet_hdr)
>  
>          new_flags = ifreq.ifr_flags;
>  
> -        if ((ifreq.ifr_flags & IFF_VNET_HDR) && !vnet_hdr) {
> -            new_flags = ifreq.ifr_flags & ~IFF_VNET_HDR;
> -            rc_on_fail = -1;
> -            errmsg = _("cannot clean IFF_VNET_HDR flag on macvtap tap");
> -        } else if ((ifreq.ifr_flags & IFF_VNET_HDR) == 0 && vnet_hdr) {
> +        if (vnet_hdr) {
>              if (ioctl(tapfd[i], TUNGETFEATURES, &features) < 0) {
>                  virReportSystemError(errno, "%s",
>                                       _("cannot get feature flags on
> macvtap tap"));
>                  return -1;
>              }
> -            if ((features & IFF_VNET_HDR)) {
> -                new_flags = ifreq.ifr_flags | IFF_VNET_HDR;
> -                errmsg = _("cannot set IFF_VNET_HDR flag on macvtap
> tap");
> -            }
> +            if (features & IFF_VNET_HDR)
> +                new_flags |= IFF_VNET_HDR;
> +        } else {
> +            new_flags &= ~IFF_VNET_HDR;
>          }
>  
> +        if (multiqueue)
> +            new_flags |= IFF_MULTI_QUEUE;
> +        else
> +            new_flags &= ~IFF_MULTI_QUEUE;
> +
>          if (new_flags != ifreq.ifr_flags) {
>              ifreq.ifr_flags = new_flags;
>              if (ioctl(tapfd[i], TUNSETIFF, &ifreq) < 0) {
> -                virReportSystemError(errno, "%s", errmsg);
> -                return rc_on_fail;
> +                virReportSystemError(errno, "%s",
> +                                     _("unable to set vnet or multiqueue
> flags on macvtap"));
> +                return -1;
>              }
>          }
>      }
> @@ -852,7 +856,7 @@ int virNetDevMacVLanCreateWithVPortProfile(const char
> *tgifname,
>          if (virNetDevMacVLanTapOpen(cr_ifname, &rc, 1, 10) < 0)
>              goto disassociate_exit;
>  
> -        if (virNetDevMacVLanTapSetup(&rc, 1, vnet_hdr) < 0) {
> +        if (virNetDevMacVLanTapSetup(&rc, 1, vnet_hdr, false) < 0) {
>              VIR_FORCE_CLOSE(rc); /* sets rc to -1 */
>              goto disassociate_exit;
>          }




More information about the libvir-list mailing list