PERFORCE change 100377 for review

Chris Jones cdjones at FreeBSD.org
Sat Jul 1 03:06:31 UTC 2006


http://perforce.freebsd.org/chv.cgi?CH=100377

Change 100377 by cdjones at cdjones-impulse on 2006/07/01 02:47:56

	..

Affected files ...

.. //depot/projects/soc2006/cdjones_jail/src/sys/kern/kern_jail.c#6 edit

Differences ...

==== //depot/projects/soc2006/cdjones_jail/src/sys/kern/kern_jail.c#6 (text+ko) ====

@@ -15,6 +15,7 @@
 #include <sys/param.h>
 #include <sys/types.h>
 #include <sys/kernel.h>
+#include <sys/kthread.h>
 #include <sys/systm.h>
 #include <sys/errno.h>
 #include <sys/sysproto.h>
@@ -92,6 +93,13 @@
 
 SYSINIT(prison, SI_SUB_INTRINSIC, SI_ORDER_ANY, init_prison, NULL);
 
+static void
+jsched_dummy(void)
+{
+  int x;
+  tsleep(&x, 0, "-", hz);
+}
+
 /*
  * MPSAFE
  *
@@ -108,6 +116,9 @@
 	struct jail_attach_args jaa;
 	int vfslocked, error, tryprid;
 
+	struct proc *j_sched_proc;
+	struct kproc_desc *j_sched_kp;
+
 	error = copyin(uap->jail, &j, sizeof(j));
 	if (error)
 		return (error);
@@ -135,6 +146,7 @@
 		goto e_dropvnref;
 	pr->pr_ip = j.ip_number;
 	pr->pr_linux = NULL;
+	pr->pr_priority = j.priority;
 	pr->pr_securelevel = securelevel;
 
 	/* Determine next pr_id and add prison to allprison list. */
@@ -159,26 +171,67 @@
 	prisoncount++;
 	mtx_unlock(&allprison_mtx);
 
+	/* TODO --- Should probably be an #ifdef SCHED_HIER here. */
+	printf("A");
+	MALLOC(j_sched_kp, struct kproc_desc *, sizeof(struct kproc_desc), M_TEMP, M_WAITOK | M_ZERO);
+	printf("B");
+	if (NULL == j_sched_kp)
+	  goto e_dropprref;
+	printf("C");
+	MALLOC(j_sched_kp->arg0, char *, (7 + 6 + 1) * sizeof(char), M_TEMP, M_WAITOK | M_ZERO);
+	printf("D");
+	if (!j_sched_kp->arg0)
+	  goto e_dropprref;
+	printf("E");
+	snprintf(j_sched_kp->arg0, 7 + 6 + 1, "jsched/%6d", pr->pr_id);
+	printf("F");
+	j_sched_kp->func = jsched_dummy;
+	printf("G");
+	j_sched_kp->global_procpp = &j_sched_proc;
+	printf("H");
+ 	kproc_start(&j_sched_kp);
+	printf("I");
+	/*	pr->pr_scheduler = (j_sched_kp->global_procpp)->p_pid; */ /* TODO - why won't this work? */
+	FREE(j_sched_kp->arg0, M_TEMP);
+	printf("J");
+	FREE(j_sched_kp, M_TEMP);
+	printf("K");
+	/* TODO --- probable #endif */
+
 	error = jail_attach(td, &jaa);
+	printf("L");
 	if (error)
 		goto e_dropprref;
+	printf("M");
 	mtx_lock(&pr->pr_mtx);
 	pr->pr_ref--;
 	mtx_unlock(&pr->pr_mtx);
+	printf("N");
 	td->td_retval[0] = jaa.jid;
+	printf("O");
 	return (0);
 e_dropprref:
+	printf("P");
+	if (j_sched_kp && j_sched_kp->arg0)
+ 	  FREE(j_sched_kp->arg0, M_TEMP);
+	printf("P1");
+	if (j_sched_kp)
+	  FREE(j_sched_kp, M_TEMP);
+	printf("P2");
 	mtx_lock(&allprison_mtx);
 	LIST_REMOVE(pr, pr_list);
 	prisoncount--;
 	mtx_unlock(&allprison_mtx);
 e_dropvnref:
+	printf("Q");
 	vfslocked = VFS_LOCK_GIANT(pr->pr_root->v_mount);
 	vrele(pr->pr_root);
 	VFS_UNLOCK_GIANT(vfslocked);
 e_killmtx:
+	printf("R");
 	mtx_destroy(&pr->pr_mtx);
 	FREE(pr, M_PRISON);
+	printf("Z");
 	return (error);
 }
 


More information about the p4-projects mailing list