PERFORCE change 100384 for review

Chris Jones cdjones at FreeBSD.org
Sat Jul 1 07:43:44 UTC 2006


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

Change 100384 by cdjones at cdjones-impulse on 2006/07/01 07:18:33

	Create kthread for jail's scheduler on jail() call.  Next milestone: add data structures to index processes by jail (per scheduler).

Affected files ...

.. //depot/projects/soc2006/cdjones_jail/src/sys/kern/kern_jail.c#7 edit
.. //depot/projects/soc2006/cdjones_jail/src/sys/sys/jail.h#8 edit

Differences ...

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

@@ -94,10 +94,25 @@
 SYSINIT(prison, SI_SUB_INTRINSIC, SI_ORDER_ANY, init_prison, NULL);
 
 static void
-jsched_dummy(void)
+jsched_td(void *arg)
 {
-  int x;
-  tsleep(&x, 0, "-", hz);
+  struct prison *pr;
+  pr = arg;
+
+  printf("Starting jail scheduler for JID %d\n", pr->pr_id);
+
+  for (;;) {
+    if (pr->pr_scheduler_flags & J_SCHED_TD_DIE) 
+      break;
+
+    printf("jsched: foo\n");
+
+    tsleep(pr, 0, '-', hz);
+  }
+
+  printf("Killing jail scheduler for JID %d\n", pr->pr_id);
+  pr->pr_scheduler_flags = J_SCHED_TD_DEAD;
+  kthread_exit(0);
 }
 
 /*
@@ -116,8 +131,12 @@
 	struct jail_attach_args jaa;
 	int vfslocked, error, tryprid;
 
-	struct proc *j_sched_proc;
-	struct kproc_desc *j_sched_kp;
+	static struct proc *j_sched_proc;
+	/*	static struct kproc_desc *j_sched_kp = {
+	  "j_sched",
+	  jsched_dummy,
+	  &j_sched_proc
+	  }; */
 
 	error = copyin(uap->jail, &j, sizeof(j));
 	if (error)
@@ -171,67 +190,34 @@
 	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)
+	/* TODO #ifdef SCHED_HIER */
+	pr->pr_scheduler_flags = J_SCHED_TD_ACTIVE;
+	if (kthread_create(jsched_td, pr, (void *) j_sched_proc, 0, 0, "jsched '%d'", pr->pr_id))
 	  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 */
+	KASSERT(j_sched_proc != NULL, ("NULL j_sched_proc"));
+	pr->pr_scheduler = j_sched_proc;
+	/* TODO #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);
 }
 
@@ -335,6 +321,10 @@
 		prisoncount--;
 		mtx_unlock(&allprison_mtx);
 
+		/* Tell scheduler to die.  No need to wait for it. */
+		pr->pr_scheduler_flags |= J_SCHED_TD_DIE;
+		wakeup(pr);
+
 		TASK_INIT(&pr->pr_task, 0, prison_complete, pr);
 		taskqueue_enqueue(taskqueue_thread, &pr->pr_task);
 		return;

==== //depot/projects/soc2006/cdjones_jail/src/sys/sys/jail.h#8 (text+ko) ====

@@ -38,6 +38,10 @@
 #define JAIL_MINIMUM_PRIORITY 1
 #define JAIL_MAXIMUM_PRIORITY 100
 
+#define J_SCHED_TD_ACTIVE 0x01
+#define J_SCHED_TD_DIE    0x02
+#define J_SCHED_TD_DEAD   0x04
+
 #ifndef _KERNEL
 
 int jail(struct jail *);
@@ -74,6 +78,7 @@
 #include <sys/proc.h>
 /*struct proc; */
 
+
 struct prison {
 	LIST_ENTRY(prison) pr_list;			/* (a) all prisons */
 	int		 pr_id;				/* (c) prison id */
@@ -88,6 +93,7 @@
 	struct mtx	 pr_mtx;
 	unsigned int	 pr_priority;			/* (p) jail priority */
         struct proc     *pr_scheduler;                  /* (c) scheduler pid */
+        int              pr_scheduler_flags;
 };
 #endif /* _KERNEL || _WANT_PRISON */
 


More information about the p4-projects mailing list