Date: Tue, 5 Dec 2006 12:52:49 GMT From: Marko Zec <zec@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 111141 for review Message-ID: <200612051252.kB5CqnO5064650@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=111141 Change 111141 by zec@zec_tca51 on 2006/12/05 12:51:52 When destroying a vnet instance, first set the per-thread vnet affinity to that instance. Do not iterate through the entire list of vnets when setting / restoring the per-thread vnet affinity. Instead, as an alternative consistency checking measure, check that the target vnet has its magic number field correctly set. Affected files ... .. //depot/projects/vimage/src/sys/kern/kern_vimage.c#4 edit .. //depot/projects/vimage/src/sys/netinet/if_ether.c#3 edit .. //depot/projects/vimage/src/sys/netinet6/nd6.c#3 edit .. //depot/projects/vimage/src/sys/sys/vimage.h#3 edit Differences ... ==== //depot/projects/vimage/src/sys/kern/kern_vimage.c#4 (text+ko) ==== @@ -420,6 +420,7 @@ panic("vi_alloc: malloc failed for vnetb \"%s\"\n", name); bzero(vnetb, sizeof(struct vnet_base)); vip->v_vnetb = vnetb; + vnetb->vnet_magic_n = VNET_MAGIC_N; vprocg = malloc(sizeof(struct vprocg), M_VPROCG, M_NOWAIT); if (vprocg == NULL) @@ -491,6 +492,8 @@ struct vprocg *vprocg = vip->v_procg; struct vcpu *vcpu = vip->v_cpu; struct ifnet *ifp; + + CURVNETB_SET(vnetb); INIT_VNET_NET(vnetb); /* return all interfaces to the parent vnetb */ @@ -516,8 +519,11 @@ free((caddr_t)vnetb->ifindex2ifnet, M_IFADDR); #endif + CURVNETB_RESTORE(); + /* hopefully, we are finally OK to free the vnetb container itself! */ LIST_REMOVE(vnetb, vnetb_le); + vnetb->vnet_magic_n = -1; free(vnetb, M_VNET); LIST_REMOVE(vprocg, vprocg_le); @@ -550,6 +556,7 @@ vimage_0.v_cpu = &vcpu_0; vnetb_tbl[0] = &vnetb_0; /* XXX */ + vnetb_0.vnet_magic_n = VNET_MAGIC_N; TAILQ_INIT(&vnet_modlink_head); ==== //depot/projects/vimage/src/sys/netinet/if_ether.c#3 (text+ko) ==== @@ -139,7 +139,7 @@ static void arptimer(void *arg) { - CURVNETB_SET(arg); + CURVNETB_SET((struct vnet_base *) arg); INIT_VNET_NET((struct vnet_base *) arg); INIT_VNET_INET((struct vnet_base *) arg); struct llinfo_arp *la, *ola; ==== //depot/projects/vimage/src/sys/netinet6/nd6.c#3 (text+ko) ==== @@ -1919,8 +1919,8 @@ nd6_slowtimo(arg) void *arg; { - CURVNETB_SET(arg); - INIT_VNET_NET(curvnetb); + CURVNETB_SET((struct vnet_base *) arg); + INIT_VNET_NET((struct vnet_base *) arg); struct nd_ifinfo *nd6if; struct ifnet *ifp; ==== //depot/projects/vimage/src/sys/sys/vimage.h#3 (text+ko) ==== @@ -82,6 +82,8 @@ int ifccnt; int sockcnt; + + int vnet_magic_n; }; struct vnet_symmap { @@ -116,26 +118,22 @@ #define VNET_SYMMAP_END \ { NULL, 0 } +#define VNET_MAGIC_N 0x3e0d8f29 + #define CURVNETB_SET(arg) \ - struct vnet_base *vnetb_iter_XXX; \ + VNET_ASSERT((arg)->vnet_magic_n == VNET_MAGIC_N); \ struct vnet_base *saved_vnetb = curvnetb; \ const char *saved_vnet_lpush = curthread->td_vnet_lpush; \ curvnetb = arg; \ curthread->td_vnet_lpush = __FUNCTION__ ; \ - LIST_FOREACH(vnetb_iter_XXX, &vnetb_head, vnetb_le) \ - if (arg == vnetb_iter_XXX) \ - break; \ - VNET_ASSERT(arg == vnetb_iter_XXX && arg != NULL ); \ if (saved_vnetb) \ printf("curvnetb_set() in %s cpu %d: %p (%s) -> %p\n", \ curthread->td_vnet_lpush, curcpu, saved_vnetb, \ saved_vnet_lpush, curvnetb); #define CURVNETB_RESTORE() \ - LIST_FOREACH(vnetb_iter_XXX, &vnetb_head, vnetb_le) \ - if (saved_vnetb == vnetb_iter_XXX) \ - break; \ - VNET_ASSERT(saved_vnetb == vnetb_iter_XXX); \ + VNET_ASSERT(saved_vnetb == NULL || \ + saved_vnetb->vnet_magic_n == VNET_MAGIC_N); \ curvnetb = saved_vnetb; \ curthread->td_vnet_lpush = saved_vnet_lpush;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200612051252.kB5CqnO5064650>