Yet more scheduler work. Revamp the batch detection heuristic and fix a few
authorMatthew Dillon <dillon@dragonflybsd.org>
Wed, 29 Jun 2005 01:25:10 +0000 (01:25 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Wed, 29 Jun 2005 01:25:10 +0000 (01:25 +0000)
things here and there.  Test the algorithm against buildworlds, mozilla,
gnome-terminal, and pine all running at once.

* Fix a bug in how I handle p_slptime.
* Move the ++p_cptime out of usched_bsd4 and into kern_clock.c.
* Redo the batch heuristic, boost the cost of doing a fork, and
  slowly decrement p_origcpu to compensate for long-running
  processes.
* Use an instantanious load instead of a time-averaged load in the
  decay calculation.

TODO: the SMP support will be virtually identical across all schedulers
and should probably be abstracted out of usched_*.c.

bin/ps/extern.h
bin/ps/keyword.c
bin/ps/print.c
sys/kern/kern_clock.c
sys/sys/usched.h

index 1f88895..9de2294 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)extern.h    8.3 (Berkeley) 4/2/94
  * $FreeBSD: src/bin/ps/extern.h,v 1.9 1999/08/27 23:14:50 peter Exp $
- * $DragonFly: src/bin/ps/extern.h,v 1.11 2004/11/22 06:50:12 dillon Exp $
+ * $DragonFly: src/bin/ps/extern.h,v 1.12 2005/06/29 01:25:10 dillon Exp $
  */
 
 struct kinfo;
@@ -71,6 +71,7 @@ void   tdpri(const KINFO *, const struct varent *);
 void    rtprior(const KINFO *, const struct varent *);
 void    printheader(void);
 void    pvar(const KINFO *, const struct varent *);
+void    pest(const KINFO *, const struct varent *);
 void    tvar(const KINFO *, const struct varent *);
 void    rssize(const KINFO *, const struct varent *);
 void    runame(const KINFO *, const struct varent *);
index 7963db6..4b5f6fb 100644 (file)
@@ -32,7 +32,7 @@
  *
  * @(#)keyword.c       8.5 (Berkeley) 4/2/94
  * $FreeBSD: src/bin/ps/keyword.c,v 1.24.2.3 2002/10/10 20:05:32 jmallett Exp $
- * $DragonFly: src/bin/ps/keyword.c,v 1.19 2005/06/27 18:38:01 dillon Exp $
+ * $DragonFly: src/bin/ps/keyword.c,v 1.20 2005/06/29 01:25:10 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -86,17 +86,20 @@ static const VAR var[] = {
        {"acflag", "ACFLG", NULL, 0, pvar, NULL, 3, POFF(p_acflag), USHORT, "x",
                NULL},
        {"acflg", "", "acflag", 0, NULL, NULL, 0, 0, 0, NULL, NULL},
+       {"batch", "BAT", NULL, 0, pest, NULL, 3, POFF(p_usdata.bsd4.origcpu), UINT, "d", NULL},
        {"blocked", "", "sigmask", 0, NULL, NULL, 0, 0, 0, NULL, NULL},
        {"caught", "", "sigcatch", 0, NULL, NULL, 0, 0, 0, NULL, NULL},
        {"command", "COMMAND", NULL, COMM|LJUST|USER, command, NULL, 16, 0, 0, NULL,
                NULL},
-       {"cpu", "CPU", NULL, 0, pvar, NULL, 3, POFF(p_usdata.bsd4.estcpu), UINT, "d", NULL},
+       {"cpu", "CPU", NULL, 0, pest, NULL, 3, POFF(p_usdata.bsd4.estcpu), UINT, "d", NULL},
        {"lastcpu", "C", NULL, 0, pvar, NULL, 3, EOFF(e_cpuid), UINT, "d", NULL},
        {"cputime", "", "time", 0, NULL, NULL, 0, 0, 0, NULL, NULL},
        {"f", "F", NULL, 0, pvar, NULL, 7, POFF(p_flag), INT, "x", NULL},
        {"flags", "", "f", 0, NULL, NULL, 0, 0, 0, NULL, NULL},
+#if 0
        {"iac", "IAC",  NULL, 0, pvar, NULL, 4, POFF(p_usdata.bsd4.interactive), CHAR, PIDFMT,
                NULL},
+#endif
        {"ignored", "", "sigignore", 0, NULL, NULL, 0, 0, 0, NULL, NULL},
        {"inblk", "INBLK", NULL, USER, rvar, NULL, 4, ROFF(ru_inblock), LONG, "ld",
                NULL},
index e98bf0e..def1961 100644 (file)
@@ -32,7 +32,7 @@
  *
  * @(#)print.c 8.6 (Berkeley) 4/16/94
  * $FreeBSD: src/bin/ps/print.c,v 1.36.2.4 2002/11/30 13:00:14 tjr Exp $
- * $DragonFly: src/bin/ps/print.c,v 1.21 2005/06/26 04:36:34 dillon Exp $
+ * $DragonFly: src/bin/ps/print.c,v 1.22 2005/06/29 01:25:10 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -657,6 +657,17 @@ pvar(const KINFO *k, const struct varent *vent)
        printval((char *)((char *)KI_PROC(k) + vent->var->off), vent);
 }
 
+void
+pest(const KINFO *k, const struct varent *vent)
+{
+       int val;
+
+       val = *(int *)((char *)KI_PROC(k) + vent->var->off);
+       val = val / 128;
+       printval((char *)&val, vent);
+}
+
+
 void
 tvar(const KINFO *k, const struct varent *vent)
 {
index 1abba49..c5eea7e 100644 (file)
@@ -70,7 +70,7 @@
  *
  *     @(#)kern_clock.c        8.5 (Berkeley) 1/21/94
  * $FreeBSD: src/sys/kern/kern_clock.c,v 1.105.2.10 2002/10/17 13:19:40 maxim Exp $
- * $DragonFly: src/sys/kern/kern_clock.c,v 1.44 2005/06/27 18:37:57 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_clock.c,v 1.45 2005/06/29 01:25:08 dillon Exp $
  */
 
 #include "opt_ntp.h"
@@ -646,6 +646,7 @@ schedclock(systimer_t info, struct intrframe *frame)
                 * that this call MUST BE MP SAFE, and the BGL IS NOT HELD
                 * HERE.
                 */
+               ++p->p_cpticks;
                 p->p_usched->schedulerclock(p, info->periodic, info->time);
        }
        if ((p = curproc) != NULL) {
index 68f4fe1..0fb0ad2 100644 (file)
@@ -3,7 +3,7 @@
  *
  *     Userland scheduler API
  * 
- * $DragonFly: src/sys/sys/usched.h,v 1.4 2005/06/27 18:37:59 dillon Exp $
+ * $DragonFly: src/sys/sys/usched.h,v 1.5 2005/06/29 01:25:06 dillon Exp $
  */
 
 #ifndef _SYS_USCHED_H_
@@ -40,7 +40,7 @@ union usched_data {
        short   priority;       /* lower is better */
        char    interactive;    /* (currently not used) */
        char    rqindex;
-       int     childscpu;
+       int     origcpu;
        int     estcpu;         /* dynamic priority modification */
     } bsd4;