Remove PUSER entirely. Since p_priority has nothing to do with kernel
authorMatthew Dillon <dillon@dragonflybsd.org>
Thu, 16 Oct 2003 23:59:15 +0000 (23:59 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Thu, 16 Oct 2003 23:59:15 +0000 (23:59 +0000)
thread priorities, the userland scheduler can now use the entire range 0-127.

Document the estcpu and other macros related to the p_priority calculation.

Adjust the default values such that a cpu bound nice -20 process will not
completely starve a nice +0 process (though it gets close!).  Note that a
nice +2 process will not run at all in the face of a cpu bound nice -20
process.

sys/kern/kern_synch.c
sys/sys/param.h
sys/sys/proc.h

index cb69b95..af83d44 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)kern_synch.c        8.9 (Berkeley) 5/19/95
  * $FreeBSD: src/sys/kern/kern_synch.c,v 1.87.2.6 2002/10/13 07:29:53 kbyanc Exp $
- * $DragonFly: src/sys/kern/kern_synch.c,v 1.23 2003/10/16 22:26:37 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_synch.c,v 1.24 2003/10/16 23:59:15 dillon Exp $
  */
 
 #include "opt_ktrace.h"
@@ -286,11 +286,8 @@ schedcpu(void *arg)
 {
        fixpt_t loadfac = loadfactor(averunnable.ldavg[0]);
        struct proc *p;
-       struct proc *curp;
        int realstathz, s;
 
-       curp = lwkt_preempted_proc(); /* YYY temporary hack */
-
        realstathz = stathz ? stathz : hz;
        FOREACH_PROC_IN_SYSTEM(p) {
                /*
@@ -809,8 +806,8 @@ resetpriority(struct proc *p)
 
        if (p->p_rtprio.type != RTP_PRIO_NORMAL)
                return;
-       newpriority = PUSER + p->p_estcpu / INVERSE_ESTCPU_WEIGHT +
-           NICE_WEIGHT * p->p_nice;
+       newpriority = NICE_ADJUST(p->p_nice - PRIO_MIN) +
+                       p->p_estcpu / ESTCPURAMP;
        newpriority = min(newpriority, MAXPRI);
        npq = newpriority / PPQ;
        crit_enter();
@@ -886,23 +883,21 @@ sched_setup(dummy)
  * a process gets worse as it accumulates CPU time.  The cpu usage
  * estimator (p_estcpu) is increased here.  resetpriority() will
  * compute a different priority each time p_estcpu increases by
- * INVERSE_ESTCPU_WEIGHT
- * (until MAXPRI is reached).  The cpu usage estimator ramps up
- * quite quickly when the process is running (linearly), and decays
- * away exponentially, at a rate which is proportionally slower when
- * the system is busy.  The basic principle is that the system will
- * 90% forget that the process used a lot of CPU time in 5 * loadav
- * seconds.  This causes the system to favor processes which haven't
- * run much recently, and to round-robin among other processes.
+ * INVERSE_ESTCPU_WEIGHT * (until MAXPRI is reached).
+ *
+ * The cpu usage estimator ramps up quite quickly when the process is 
+ * running (linearly), and decays away exponentially, at a rate which
+ * is proportionally slower when the system is busy.  The basic principle
+ * is that the system will 90% forget that the process used a lot of CPU
+ * time in 5 * loadav seconds.  This causes the system to favor processes
+ * which haven't run much recently, and to round-robin among other processes.
  */
 void
-schedclock(p)
-       struct proc *p;
+schedclock(struct proc *p)
 {
-
        p->p_cpticks++;
        p->p_estcpu = ESTCPULIM(p->p_estcpu + 1);
-       if ((p->p_estcpu % INVERSE_ESTCPU_WEIGHT) == 0)
+       if ((p->p_estcpu % PPQ) == 0)
                resetpriority(p);
 }
 
index 492ca8a..905c6ca 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)param.h     8.3 (Berkeley) 4/4/95
  * $FreeBSD: src/sys/sys/param.h,v 1.61.2.38 2003/05/22 17:12:01 fjoe Exp $
- * $DragonFly: src/sys/sys/param.h,v 1.6 2003/08/20 07:31:21 rob Exp $
+ * $DragonFly: src/sys/sys/param.h,v 1.7 2003/10/16 23:59:13 dillon Exp $
  */
 
 #ifndef _SYS_PARAM_H_
  * Priorities.  Note that with 32 run queues, differences less than 4 are
  * insignificant.
  */
-#define        PUSER   50
 #define        MAXPRI  127             /* Priorities range from 0 through MAXPRI. */
 
 #define        PCATCH          0x0100  /* OR'd with pri for tsleep to check signals */
index b50cc90..b659bae 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)proc.h      8.15 (Berkeley) 5/19/95
  * $FreeBSD: src/sys/sys/proc.h,v 1.99.2.9 2003/06/06 20:21:32 tegge Exp $
- * $DragonFly: src/sys/sys/proc.h,v 1.32 2003/10/16 22:26:42 dillon Exp $
+ * $DragonFly: src/sys/sys/proc.h,v 1.33 2003/10/16 23:59:13 dillon Exp $
  */
 
 #ifndef _SYS_PROC_H_
@@ -375,17 +375,26 @@ extern int        whichrtqs;      /* Bit mask summary of non-empty Q's. */
 extern int     whichidqs;      /* Bit mask summary of non-empty Q's. */
 
 /*
- * XXX macros for scheduler.  Shouldn't be here, but currently needed for
- * bounding the dubious p_estcpu inheritance in wait1().
- * INVERSE_ESTCPU_WEIGHT is only suitable for statclock() frequencies in
- * the range 100-256 Hz (approximately).
+ * Scheduler estcpu macros.
+ *
+ * p_priority = NICE_ADJUST(p->p_nice - PRIO_MIN) +
+ *                     p->p_estcpu / ESTCPURAMP;
+ *
+ * NICE_WEIGHT determines the p_estcpu overlap between nice levels.   It
+ * cannot exceed 3.0.  A value of 2.0 gives us a nice small overlap between
+ * nice -20 and nice +0.  A value of 3.0 reduces the overlap while a value
+ * of 1.0 increases the overlap.
+ *
+ * ESTCPURAMP determines how slowly estcpu effects the process priority.
+ * Higher numbers result in slower ramp-up times because estcpu is incremented
+ * once per scheduler tick and maxes out at ESTCPULIM.
  */
-#define        ESTCPULIM(e) \
-    min((e), INVERSE_ESTCPU_WEIGHT * (NICE_WEIGHT * PRIO_MAX - PPQ) + \
-            INVERSE_ESTCPU_WEIGHT - 1)
-#define        INVERSE_ESTCPU_WEIGHT   8       /* 1 / (priorities per estcpu level) */
-#define        NICE_WEIGHT     2               /* priorities per nice level */
-#define        PPQ             (128 / NQS)     /* priorities per queue */
+
+#define ESTCPURAMP     8                       /* higher equals slower */
+#define NICE_ADJUST(value)     (((unsigned int)(NICE_WEIGHT * 128) * (value)) / 128)
+#define ESTCPULIM(v)   min((v), (MAXPRI - NICE_ADJUST(PRIO_MAX - PRIO_MIN)) * ESTCPURAMP)
+#define        NICE_WEIGHT     2.0                     /* priorities per nice level */
+#define        PPQ             ((MAXPRI + 1) / NQS)    /* priorities per queue */
 
 extern u_long ps_arg_cache_limit;
 extern int ps_argsopen;