[libvirt] [PATCH] Remove MAX_TAP_ID, take 2
Daniel P. Berrange
berrange at redhat.com
Wed Jul 29 16:32:08 UTC 2009
On Wed, Jul 29, 2009 at 12:27:58AM -0400, Aron Griffis wrote:
> (Sorry, my first posting included some gnulib droppings in the
> patch. This removes that, everything else is the same.)
>
> As far as I can tell, there's no reason to format the device string in
> brAddTap(). Delegate the job to TUNSETIFF, thereby removing the loop
> and the MAX_TAP_ID artificial limit. This patch allows me to get
> 421 guests running before hitting other limits.
Very bizarre, the kernel seems to interpret 'vnet%d' and auto
fillin the unique integer for us. So this patch is just removing
the equivalent logic from libvirt. Wonder why we had it there in
the first place ! So this looks basically sound to me.
Out of interest, what are the other limits you hit .. ?
This patch does not apply though - I think it has whitespace
damage from your mail client - neither patch, or git apply
like it. Could you try re-sending it..
Regards,
Daniel
>
> Signed-off-by: Aron Griffis <aron.griffis at hp.com>
> ---
>
> src/bridge.c | 94 +++++++++++++++++++++-------------------------------------
> 1 files changed, 34 insertions(+), 60 deletions(-)
>
> diff --git a/src/bridge.c b/src/bridge.c
> index 0509afd..ec37192 100644
> --- a/src/bridge.c
> +++ b/src/bridge.c
> @@ -49,8 +49,6 @@
> #include "util.h"
> #include "logging.h"
>
> -#define MAX_TAP_ID 256
> -
> #define JIFFIES_TO_MS(j) (((j)*1000)/HZ)
> #define MS_TO_JIFFIES(ms) (((ms)*HZ)/1000)
>
> @@ -466,76 +464,52 @@ brAddTap(brControl *ctl,
> int vnet_hdr,
> int *tapfd)
> {
> - int id, subst, fd;
> + int fd, len;
> + struct ifreq ifr = {0};
>
> if (!ctl || !ctl->fd || !bridge || !ifname)
> return EINVAL;
>
> - subst = id = 0;
> -
> - if (strstr(*ifname, "%d"))
> - subst = 1;
> -
> if ((fd = open("/dev/net/tun", O_RDWR)) < 0)
> return errno;
>
> - if (vnet_hdr)
> - vnet_hdr = brProbeVnetHdr(fd);
> + ifr.ifr_flags = IFF_TAP|IFF_NO_PI;
>
> - do {
> - struct ifreq try;
> - int len;
> +#ifdef IFF_VNET_HDR
> + if (vnet_hdr && brProbeVnetHdr(fd))
> + ifr.ifr_flags |= IFF_VNET_HDR;
> +#endif
>
> - memset(&try, 0, sizeof(struct ifreq));
> + strncpy(ifr.ifr_name, *ifname, IFNAMSIZ-1);
>
> - try.ifr_flags = IFF_TAP|IFF_NO_PI;
> + if (ioctl(fd, TUNSETIFF, &ifr) < 0)
> + goto error;
>
> -#ifdef IFF_VNET_HDR
> - if (vnet_hdr)
> - try.ifr_flags |= IFF_VNET_HDR;
> -#endif
> + len = strlen(ifr.ifr_name);
> + if (len >= BR_IFNAME_MAXLEN - 1) {
> + errno = EINVAL;
> + goto error;
> + }
>
> - if (subst) {
> - len = snprintf(try.ifr_name, BR_IFNAME_MAXLEN, *ifname, id);
> - if (len >= BR_IFNAME_MAXLEN) {
> - errno = EADDRINUSE;
> - goto error;
> - }
> - } else {
> - len = strlen(*ifname);
> - if (len >= BR_IFNAME_MAXLEN - 1) {
> - errno = EINVAL;
> - goto error;
> - }
> -
> - strncpy(try.ifr_name, *ifname, len);
> - try.ifr_name[len] = '\0';
> - }
> -
> - if (ioctl(fd, TUNSETIFF, &try) == 0) {
> - /* We need to set the interface MTU before adding it
> - * to the bridge, because the bridge will have its
> - * MTU adjusted automatically when we add the new interface.
> - */
> - if ((errno = brSetInterfaceMtu(ctl, bridge, try.ifr_name)))
> - goto error;
> - if ((errno = brAddInterface(ctl, bridge, try.ifr_name)))
> - goto error;
> - if ((errno = brSetInterfaceUp(ctl, try.ifr_name, 1)))
> - goto error;
> - if (!tapfd &&
> - (errno = ioctl(fd, TUNSETPERSIST, 1)))
> - goto error;
> - VIR_FREE(*ifname);
> - if (!(*ifname = strdup(try.ifr_name)))
> - goto error;
> - if (tapfd)
> - *tapfd = fd;
> - return 0;
> - }
> -
> - id++;
> - } while (subst && id <= MAX_TAP_ID);
> + /* We need to set the interface MTU before adding it
> + * to the bridge, because the bridge will have its
> + * MTU adjusted automatically when we add the new interface.
> + */
> + if ((errno = brSetInterfaceMtu(ctl, bridge, ifr.ifr_name)))
> + goto error;
> + if ((errno = brAddInterface(ctl, bridge, ifr.ifr_name)))
> + goto error;
> + if ((errno = brSetInterfaceUp(ctl, ifr.ifr_name, 1)))
> + goto error;
> + if (!tapfd &&
> + (errno = ioctl(fd, TUNSETPERSIST, 1)))
> + goto error;
> + VIR_FREE(*ifname);
> + if (!(*ifname = strdup(ifr.ifr_name)))
> + goto error;
> + if (tapfd)
> + *tapfd = fd;
> + return 0;
>
> error:
> close(fd);
>
> --
> Libvir-list mailing list
> Libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
--
|: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
More information about the libvir-list
mailing list