Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 18 Aug 2006 15:52:26 GMT
From:      Chris Jones <cdjones@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 104493 for review
Message-ID:  <200608181552.k7IFqQhd008585@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=104493

Change 104493 by cdjones@cdjones-impulse on 2006/08/18 15:52:06

	Unlock some things that didn't need locking (which caused sleepable-after-non-sleepable panics anyways) and switch to a system where we throw you to the back of the line on the basis of ratio between (cpu used / total cpu) and (shares held / total shares), rather than the difference between the two.  It works better.

Affected files ...

.. //depot/projects/soc2006/cdjones_jail/src/sys/kern/sched_hier.c#17 edit

Differences ...

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

@@ -295,7 +295,7 @@
 	   &sched_kgfollowons, 0,
 	   "number of followons done in a ksegrp");
 
-static int sched_unjailedProcessShares = 50;
+static int sched_unjailedProcessShares = 0;
 SYSCTL_INT(_kern_sched, OID_AUTO, unjailedprocessshares, 
 	   CTLTYPE_INT | CTLFLAG_RW,
 	   &sched_unjailedProcessShares, 0,
@@ -460,7 +460,6 @@
 	mtx_lock(&allprison_mtx);
 	if (prisoncount) {
 		LIST_FOREACH(pr, &allprison, pr_list) {
-			mtx_lock(&pr->pr_mtx);
 			pr->pr_estcpu = 0;
 		}
 	}
@@ -553,7 +552,7 @@
 			if (NULL != kg->kg_proc->p_ucred &&
 			    NULL != kg->kg_proc->p_ucred->cr_prison)
 				kg->kg_proc->p_ucred->cr_prison->pr_estcpu += 
-				  kg->kg_estcpu;
+				kg->kg_estcpu;
 		      	resetpriority(kg);
 			FOREACH_THREAD_IN_GROUP(kg, td) {
 				resetpriority_thread(td, kg);
@@ -561,11 +560,6 @@
 		} /* end of ksegrp loop */
 		mtx_unlock_spin(&sched_lock);
 	} /* end of process loop */
-	if (prisoncount) {
-		LIST_FOREACH(pr, &allprison, pr_list) {
-			mtx_unlock(&pr->pr_mtx);
-		}
-	}
 	mtx_unlock(&allprison_mtx);
 	sx_sunlock(&allproc_lock);
 }
@@ -649,7 +643,10 @@
 	if (kg->kg_pri_class == PRI_TIMESHARE) {
 		newpriority = PUSER + kg->kg_estcpu / INVERSE_ESTCPU_WEIGHT +
 		    NICE_WEIGHT * (kg->kg_proc->p_nice - PRIO_MIN);
-		if (NULL != pr) {
+		if (NULL == pr) {
+			newpriority = min(max(newpriority, PRI_MIN_TIMESHARE),
+			    PRI_MAX_TIMESHARE);
+		} else {
 		  /* 
 		   * Skew the priority by the jail's share of CPU resources.
 		   * The unjailed processes get half the CPU time.
@@ -659,21 +656,36 @@
 		   * reserved to unjailed processes really should be sysctl'd.
 		   */ 
 			register unsigned int np = newpriority;
-			register unsigned int skew = PRI_MAX_TIMESHARE;
-			skew -= PRI_MIN_TIMESHARE;
-			skew /= 16;
-
+			register unsigned int skew;
+			skew = pr->pr_estcpu * total_jail_sched_shares;
+			skew /= max(total_est_cpu, 1) * max(pr->pr_sched_shares, 1);
+			if (skew > 0) {
+				/* wait your turn until your cpu usage's proportionate */
+				newpriority = PRI_MAX_IDLE;
+			} else {
+			newpriority = min(max(newpriority, PRI_MIN_TIMESHARE),
+			    PRI_MAX_TIMESHARE);
+			}
+/*
+			a = skew;
 			skew *= pr->pr_sched_shares;
+			b = skew;
 			skew *= pr->pr_estcpu;
+			c = skew; */
 			/* avoid divide-by-zero hazards */
-			skew /= max(total_jail_sched_shares, 1);
+/*			skew /= max(total_jail_sched_shares, 1);
+			d = skew;
 			skew /= max(total_est_cpu, 1);
+			e = skew;
+*/
 
-			printf("resetpriority: skewing KSE %p to %d from %d\n",
-				&kg, np + skew, np);
+/*			newpriority += skew; */
+			printf("skew KSE %p (%d / %d cpu, %d / %d shares) from %d to %d\n",
+				&kg, pr->pr_estcpu, total_est_cpu,
+				pr->pr_sched_shares, 
+				total_jail_sched_shares,
+				np, newpriority);
 		}
-		newpriority = min(max(newpriority, PRI_MIN_TIMESHARE),
-		    PRI_MAX_TIMESHARE);
 		kg->kg_user_pri = newpriority;
 	}
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200608181552.k7IFqQhd008585>