From owner-p4-projects@FreeBSD.ORG Tue Dec 5 12:54:31 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 6EB1416A506; Tue, 5 Dec 2006 12:54:31 +0000 (UTC) X-Original-To: perforce@FreeBSD.org Delivered-To: perforce@FreeBSD.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 13C1C16A503 for ; Tue, 5 Dec 2006 12:54:31 +0000 (UTC) (envelope-from zec@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.FreeBSD.org (Postfix) with ESMTP id CABF143CBB for ; Tue, 5 Dec 2006 12:52:28 +0000 (GMT) (envelope-from zec@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id kB5Cqoc6064661 for ; Tue, 5 Dec 2006 12:52:50 GMT (envelope-from zec@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id kB5CqnO5064650 for perforce@freebsd.org; Tue, 5 Dec 2006 12:52:49 GMT (envelope-from zec@FreeBSD.org) Date: Tue, 5 Dec 2006 12:52:49 GMT Message-Id: <200612051252.kB5CqnO5064650@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to zec@FreeBSD.org using -f From: Marko Zec To: Perforce Change Reviews Cc: Subject: PERFORCE change 111141 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 05 Dec 2006 12:54:31 -0000 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;