Date: Wed, 13 May 2009 23:47:26 GMT From: Marko Zec <zec@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 162046 for review Message-ID: <200905132347.n4DNlQqi091422@repoman.freebsd.org>
index | next in thread | raw e-mail
http://perforce.freebsd.org/chv.cgi?CH=162046 Change 162046 by zec@zec_tpx32 on 2009/05/13 23:46:54 When processing requests to create an instance of a cloning ifnet, and the cloner for the requested cloning ifnet class is not found in the current vnet, look up for the cloner in the default vnet. Apply the same logic when attempting to destroy a cloning ifnet. In effect, this simple change allows for having both per-vnet and global unit numbers for cloning ifnets. Only if_loop is currently registered on a per-vnet basis, so by default all the other cloning ifnet types will be assigned globally unique ifunit numbers. Let it remain noted that I was personally strongly opposed to introducing such special-case logic, which I believe will cause us more trouble than good in the long run, as users / applications running in parallel vnets will not be able to rely on predictability and availability of free ifunits. For example, if a user / application in a non-default vnet requests and gets a vlan0 instance, a later request for vlan0 creation in the default vnet will fail without any reasonable or obvious explanation. Affected files ... .. //depot/projects/vimage-commit2/src/sys/kern/kern_vimage.c#40 edit .. //depot/projects/vimage-commit2/src/sys/net/if_clone.c#8 edit .. //depot/projects/vimage-commit2/src/sys/sys/vimage.h#60 edit Differences ... ==== //depot/projects/vimage-commit2/src/sys/kern/kern_vimage.c#40 (text+ko) ==== @@ -94,6 +94,8 @@ static u_int last_vi_id = 0; static u_int last_vnet_id = 0; static u_int last_vprocg_id = 0; + +struct vnet *vnet0; #endif #ifdef VIMAGE @@ -721,6 +723,8 @@ panic("vi_alloc: malloc failed for vnet \"%s\"\n", name); vip->v_net = vnet; vnet->vnet_id = last_vnet_id++; + if (vnet->vnet_id == 0) + vnet0 = vnet; vnet->vnet_magic_n = VNET_MAGIC_N; vprocg = malloc(sizeof(struct vprocg), M_VPROCG, M_NOWAIT | M_ZERO); ==== //depot/projects/vimage-commit2/src/sys/net/if_clone.c#8 (text+ko) ==== @@ -159,6 +159,17 @@ break; } } +#ifdef VIMAGE + if (ifc == NULL && !IS_DEFAULT_VNET(curvnet)) { + CURVNET_SET_QUIET(vnet0); + INIT_VNET_NET(vnet0); + LIST_FOREACH(ifc, &V_if_cloners, ifc_list) { + if (ifc->ifc_match(ifc, name)) + break; + } + CURVNET_RESTORE(); + } +#endif IF_CLONERS_UNLOCK(); if (ifc == NULL) @@ -217,6 +228,17 @@ break; } } +#ifdef VIMAGE + if (ifc == NULL && !IS_DEFAULT_VNET(curvnet)) { + CURVNET_SET_QUIET(vnet0); + INIT_VNET_NET(vnet0); + LIST_FOREACH(ifc, &V_if_cloners, ifc_list) { + if (ifc->ifc_match(ifc, name)) + break; + } + CURVNET_RESTORE(); + } +#endif IF_CLONERS_UNLOCK(); if (ifc == NULL) return (EINVAL); @@ -235,6 +257,13 @@ if (ifc->ifc_destroy == NULL) return(EOPNOTSUPP); + /* + * Given that the cloned ifnet might be attached to a different + * vnet from where it's cloner was registered, we have to + * switch to the vnet context of the target vnet. + */ + CURVNET_SET_QUIET(ifp->if_vnet); + IF_CLONE_LOCK(ifc); IFC_IFLIST_REMOVE(ifc, ifp); IF_CLONE_UNLOCK(ifc); @@ -250,6 +279,7 @@ IFC_IFLIST_INSERT(ifc, ifp); IF_CLONE_UNLOCK(ifc); } + CURVNET_RESTORE(); return (err); } ==== //depot/projects/vimage-commit2/src/sys/sys/vimage.h#60 (text+ko) ==== @@ -307,6 +307,7 @@ #ifdef VIMAGE LIST_HEAD(vnet_list_head, vnet); extern struct vnet_list_head vnet_head; +extern struct vnet *vnet0; #define VNET_ITERATOR_DECL(arg) struct vnet *arg; #define VNET_FOREACH(arg) LIST_FOREACH(arg, &vnet_head, vnet_le) #elsehelp
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200905132347.n4DNlQqi091422>
