PERFORCE change 161703 for review
Marko Zec
zec at FreeBSD.org
Thu May 7 02:45:15 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=161703
Change 161703 by zec at zec_tpx32 on 2009/05/07 02:45:03
Make both GENERIC and VIMAGE boot on i386.
Affected files ...
.. //depot/projects/vimage-commit/src/sys/kern/init_main.c#11 edit
.. //depot/projects/vimage-commit/src/sys/kern/kern_prot.c#9 edit
.. //depot/projects/vimage-commit/src/sys/kern/kern_vimage.c#16 edit
.. //depot/projects/vimage-commit/src/sys/sys/vimage.h#23 edit
Differences ...
==== //depot/projects/vimage-commit/src/sys/kern/init_main.c#11 (text+ko) ====
@@ -454,7 +454,8 @@
p->p_ucred->cr_ruidinfo = uifind(0);
p->p_ucred->cr_prison = NULL; /* Don't jail it. */
#ifdef VIMAGE
- P_TO_VIMAGE(p) = LIST_FIRST(&vimage_head);
+ KASSERT(LIST_FIRST(&vimage_head) != NULL, ("vimage_head empty"));
+ P_TO_VIMAGE(p) = LIST_FIRST(&vimage_head); /* set ucred->cr_vimage */
refcount_acquire(&P_TO_VIMAGE(p)->vi_ucredrefc);
LIST_FIRST(&vprocg_head)->nprocs++;
#endif
==== //depot/projects/vimage-commit/src/sys/kern/kern_prot.c#9 (text+ko) ====
@@ -1826,6 +1826,8 @@
if (jailed(cr))
prison_free(cr->cr_prison);
#ifdef VIMAGE
+ /* XXX TODO: find out why and when cr_vimage can be NULL here! */
+ if (cr->cr_vimage != NULL)
refcount_release(&cr->cr_vimage->vi_ucredrefc);
#endif
#ifdef AUDIT
==== //depot/projects/vimage-commit/src/sys/kern/kern_vimage.c#16 (text+ko) ====
@@ -48,6 +48,7 @@
MALLOC_DEFINE(M_VIMAGE, "vimage", "vimage resource container");
MALLOC_DEFINE(M_VNET, "vnet", "network stack control block");
+MALLOC_DEFINE(M_VPROCG, "vprocg", "process group control block");
static TAILQ_HEAD(vnet_modlink_head, vnet_modlink) vnet_modlink_head;
static TAILQ_HEAD(vnet_modpending_head, vnet_modlink) vnet_modpending_head;
@@ -300,6 +301,8 @@
vi_init(void *unused)
{
#ifdef VIMAGE
+ struct vimage *vip;
+ struct vprocg *vprocg;
struct vnet *vnet;
#endif
@@ -307,13 +310,27 @@
TAILQ_INIT(&vnet_modpending_head);
#ifdef VIMAGE
+ LIST_INIT(&vimage_head);
+ LIST_INIT(&vprocg_head);
LIST_INIT(&vnet_head);
+ vip = malloc(sizeof(struct vimage), M_VIMAGE, M_NOWAIT | M_ZERO);
+ if (vip == NULL)
+ panic("malloc failed for struct vimage");
+ LIST_INSERT_HEAD(&vimage_head, vip, vi_le);
+
+ vprocg = malloc(sizeof(struct vprocg), M_VPROCG, M_NOWAIT | M_ZERO);
+ if (vprocg == NULL)
+ panic("malloc failed for struct vprocg");
+ vip->v_procg = vprocg;
+ LIST_INSERT_HEAD(&vprocg_head, vprocg, vprocg_le);
+
vnet = malloc(sizeof(struct vnet), M_VNET, M_NOWAIT | M_ZERO);
if (vnet == NULL)
panic("vi_alloc: malloc failed");
LIST_INSERT_HEAD(&vnet_head, vnet, vnet_le);
vnet->vnet_magic_n = VNET_MAGIC_N;
+ vip->v_net = vnet;
/* We MUST clear curvnet in vi_init_done before going SMP. */
curvnet = LIST_FIRST(&vnet_head);
==== //depot/projects/vimage-commit/src/sys/sys/vimage.h#23 (text+ko) ====
@@ -302,12 +302,26 @@
#define IS_DEFAULT_VNET(arg) 1
#endif
+#ifdef VIMAGE
#define TD_TO_VIMAGE(td) (td)->td_ucred->cr_vimage
#define TD_TO_VNET(td) (td)->td_ucred->cr_vimage->v_net
#define TD_TO_VPROCG(td) (td)->td_ucred->cr_vimage->v_procg
#define P_TO_VIMAGE(p) (p)->p_ucred->cr_vimage
#define P_TO_VNET(p) (p)->p_ucred->cr_vimage->v_net
#define P_TO_VPROCG(p) (p)->p_ucred->cr_vimage->v_procg
+#else
+#define TD_TO_VIMAGE(td) NULL
+#define TD_TO_VNET(td) NULL
+#define P_TO_VIMAGE(p) NULL
+#define P_TO_VNET(p) NULL
+#ifdef VIMAGE_GLOBALS
+#define TD_TO_VPROCG(td) NULL
+#define P_TO_VPROCG(p) NULL
+#else
+#define TD_TO_VPROCG(td) &vprocg_0
+#define P_TO_VPROCG(p) &vprocg_0
+#endif
+#endif
/* Non-VIMAGE null-macros */
#define VNET_LIST_RLOCK()
More information about the p4-projects
mailing list