Date: Sun, 9 Sep 2007 23:30:49 GMT From: Marko Zec <zec@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 126243 for review Message-ID: <200709092330.l89NUnVK097137@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=126243 Change 126243 by zec@zec_tpx32 on 2007/09/09 23:30:14 Modify vi_destroy() to return an error if attempting to kill a vnet with live sockets. This is completely unprotected from races and needs more thought / work. In addition to ethernet/VLAN ifnets, allow for ng_iface ifnets to be reassigned from one vnet to another as well. Affected files ... .. //depot/projects/vimage/src/sys/kern/kern_vimage.c#36 edit Differences ... ==== //depot/projects/vimage/src/sys/kern/kern_vimage.c#36 (text+ko) ==== @@ -51,12 +51,14 @@ #include <net/if_clone.h> #include <net/ethernet.h> +//#define DEBUG_ORDERING + MALLOC_DEFINE(M_VIMAGE, "vimage", "virtual image resource container"); MALLOC_DEFINE(M_VNET, "vnet", "network stack control block"); MALLOC_DEFINE(M_VPROCG, "vprocg", "process group control block"); MALLOC_DEFINE(M_VCPU, "vcpu", "cpu resource control block"); -static void vi_destroy(struct vimage *); +static int vi_destroy(struct vimage *); static void vnet_mod_complete_registration(struct vnet_modlink *); static int vnet_mod_constructor(struct vnet_modlink *); static int vnet_mod_destructor(struct vnet_modlink *); @@ -333,6 +335,9 @@ bcopy(IF_LLADDR(ifp), eaddr, 6); ether_ifdetach(ifp); break; + case IFT_PROPVIRTUAL: /* XXX ng_eiface */ + if_detach(ifp); + break; default: panic("don't know yet how to handle iftype %d", ifp->if_type); /* if_detach(ifp); */ @@ -374,21 +379,22 @@ int unit = 0; struct ifnet *iter; +#define FINDFREEUNIT(dname) \ + do { \ + snprintf(ifp->if_xname, IFNAMSIZ, "%s%d", dname, unit); \ + TAILQ_FOREACH(iter, &V_ifnet, if_link) \ + if (strcmp(ifp->if_xname, iter->if_xname) == 0) \ + break; \ + unit++; \ + } while (iter); + switch (ifp->if_type) { case IFT_ETHER: case IFT_L2VLAN: - do { - snprintf(ifp->if_xname, - IFNAMSIZ, "eth%d", unit); - TAILQ_FOREACH(iter, &V_ifnet, - if_link) - if (strcmp( - ifp->if_xname, - iter->if_xname) - == 0) - break; - unit++; - } while (iter); + FINDFREEUNIT("eth"); + break; + case IFT_PROPVIRTUAL: + FINDFREEUNIT("ser"); break; default: break; @@ -401,6 +407,9 @@ case IFT_L2VLAN: ether_ifattach(ifp, eaddr); break; + case IFT_PROPVIRTUAL: /* XXX ng_eiface */ + if_attach(ifp); + break; default: panic("don't know yet how to handle iftype %d", ifp->if_type); /* if_attach(ifp); */ @@ -484,7 +493,7 @@ case SIOCSPVIMAGE: if (vi_req->req_action == VI_DESTROY) { - vi_destroy(vip_r); + error = vi_destroy(vip_r); break; } @@ -627,7 +636,7 @@ * the timers... How can one ever be sure to have done *all* the necessary * steps? */ -static void +static int vi_destroy(struct vimage *vip) { struct vnet *vnet = vip->v_vnet; @@ -636,6 +645,10 @@ struct ifnet *ifp, *nifp; struct vnet_modlink *vml; + /* XXX Beware of races -> more locking to be done... */ + if (vnet->sockcnt != 0) + return (EBUSY); + VNET_LIST_LOCK(); LIST_REMOVE(vnet, vnet_le); VNET_LIST_UNLOCK(); @@ -679,6 +692,8 @@ LIST_REMOVE(vip, vi_le); vi_free(vip, M_VIMAGE); + + return (0); } static int vnet_mod_constructor(vml)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200709092330.l89NUnVK097137>