Move remaining scheduler-specific functions into the usched abstraction.
authorMatthew Dillon <dillon@dragonflybsd.org>
Sun, 26 Jun 2005 04:36:35 +0000 (04:36 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Sun, 26 Jun 2005 04:36:35 +0000 (04:36 +0000)
This also involves rearranging a number of fields in the proc structure,
changing the proc structure (actually making it a bit smaller due to better
packing).  A complete rebuild is required.

bin/ps/keyword.c
bin/ps/print.c
bin/ps/ps.c
sys/kern/kern_exit.c
sys/kern/kern_fork.c
sys/kern/kern_synch.c
sys/sys/proc.h
sys/sys/usched.h
usr.bin/top/machine.c

index 83eb88d..62b2322 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.17 2004/11/22 06:50:12 dillon Exp $
+ * $DragonFly: src/bin/ps/keyword.c,v 1.18 2005/06/26 04:36:34 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -95,7 +95,7 @@ static const VAR var[] = {
        {"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},
-       {"iac", "IAC",  NULL, 0, pvar, NULL, 4, POFF(p_interactive), CHAR, PIDFMT,
+       {"iac", "IAC",  NULL, 0, pvar, NULL, 4, POFF(p_usdata.bsd4.interactive), CHAR, PIDFMT,
                NULL},
        {"ignored", "", "sigignore", 0, NULL, NULL, 0, 0, 0, NULL, NULL},
        {"inblk", "INBLK", NULL, USER, rvar, NULL, 4, ROFF(ru_inblock), LONG, "ld",
index 5654fe6..e98bf0e 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.20 2005/03/17 02:17:54 dillon Exp $
+ * $DragonFly: src/bin/ps/print.c,v 1.21 2005/06/26 04:36:34 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -238,12 +238,14 @@ state(const KINFO *k, const struct varent *vent)
 /*
  * Normalized priority (lower is better).  For pure threads
  * output a negated LWKT priority (so lower still means better).
+ *
+ * XXX bsd4 scheduler specific.
  */
 void
 pri(const KINFO *k, const struct varent *vent)
 {
        if (KI_THREAD(k)->td_proc)
-           printf("%*d", vent->width, KI_PROC(k)->p_priority);
+           printf("%*d", vent->width, KI_PROC(k)->p_usdata.bsd4.priority);
        else
            printf("%*d", vent->width, -(KI_THREAD(k)->td_pri & TDPRI_MASK));
 }
index d9d6388..5c25a29 100644 (file)
@@ -33,7 +33,7 @@
  * @(#) Copyright (c) 1990, 1993, 1994 The Regents of the University of California.  All rights reserved.
  * @(#)ps.c    8.4 (Berkeley) 4/2/94
  * $FreeBSD: src/bin/ps/ps.c,v 1.30.2.6 2002/07/04 08:30:37 sobomax Exp $
- * $DragonFly: src/bin/ps/ps.c,v 1.15 2004/11/17 10:09:44 joerg Exp $
+ * $DragonFly: src/bin/ps/ps.c,v 1.16 2005/06/26 04:36:34 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -589,7 +589,7 @@ pscomp(const void *a, const void *b)
                  KI_EPROC(k)->e_vm.vm_tsize)
 
        if (sortby == SORTIAC)
-               return (KI_PROC((const KINFO *)a)->p_interactive - KI_PROC((const KINFO *)b)->p_interactive);
+               return (KI_PROC((const KINFO *)a)->p_usdata.bsd4.interactive - KI_PROC((const KINFO *)b)->p_usdata.bsd4.interactive);
        if (sortby == SORTCPU)
                return (getpcpu((const KINFO *)b) - getpcpu((const KINFO *)a));
        if (sortby == SORTMEM)
index fadb854..6fce230 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)kern_exit.c 8.7 (Berkeley) 2/12/94
  * $FreeBSD: src/sys/kern/kern_exit.c,v 1.92.2.11 2003/01/13 22:51:16 dillon Exp $
- * $DragonFly: src/sys/kern/kern_exit.c,v 1.42 2005/06/25 20:03:28 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_exit.c,v 1.43 2005/06/26 04:36:31 dillon Exp $
  */
 
 #include "opt_compat.h"
@@ -452,14 +452,16 @@ loop:
                        continue;
 
                /* This special case handles a kthread spawned by linux_clone 
-                * (see linux_misc.c).  The linux_wait4 and linux_waitpid functions
-                * need to be able to distinguish between waiting on a process and
-                * waiting on a thread.  It is a thread if p_sigparent is not SIGCHLD,
-                * and the WLINUXCLONE option signifies we want to wait for threads
-                * and not processes.
+                * (see linux_misc.c).  The linux_wait4 and linux_waitpid 
+                * functions need to be able to distinguish between waiting
+                * on a process and waiting on a thread.  It is a thread if
+                * p_sigparent is not SIGCHLD, and the WLINUXCLONE option
+                * signifies we want to wait for threads and not processes.
                 */
-               if ((p->p_sigparent != SIGCHLD) ^ ((options & WLINUXCLONE) != 0))
+               if ((p->p_sigparent != SIGCHLD) ^ 
+                   ((options & WLINUXCLONE) != 0)) {
                        continue;
+               }
 
                nfound++;
                if (p->p_stat == SZOMB) {
@@ -488,17 +490,8 @@ loop:
                        }
                        lwkt_wait_free(p->p_thread);
 
-                       /*
-                        * Charge the parent for the child's change in
-                        * estimated cpu as of when the child exits to
-                        * account for batch scripts, large make's, etc.
-                        */
-                       if (q->p_pid != 1) {
-                           if (p->p_estcpu > p->p_estcpu_fork) {
-                               q->p_estcpu = ESTCPULIM(q->p_estcpu +
-                                               p->p_estcpu - p->p_estcpu_fork);
-                           }
-                       }
+                       /* scheduling hook for heuristic */
+                       p->p_usched->heuristic_exiting(q, p);
 
                        /* Take care of our return values. */
                        *res = p->p_pid;
index 3804675..11951d8 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)kern_fork.c 8.6 (Berkeley) 4/8/94
  * $FreeBSD: src/sys/kern/kern_fork.c,v 1.72.2.14 2003/06/26 04:15:10 silby Exp $
- * $DragonFly: src/sys/kern/kern_fork.c,v 1.34 2005/06/25 20:03:28 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_fork.c,v 1.35 2005/06/26 04:36:31 dillon Exp $
  */
 
 #include "opt_ktrace.h"
@@ -509,22 +509,10 @@ again:
 #endif
 
        /*
-        * Give the child process an estcpu skewed towards the batch side
-        * of the parent.  This prevents batch programs from glitching 
-        * interactive programs when they are first started.  If the child
-        * is not a batch program it's priority will be corrected by the
-        * scheduler.
-        *
-        * The interactivity model always starts at 0 (par value).
-        */
-       p2->p_estcpu_fork = p2->p_estcpu = 
-               ESTCPULIM(p1->p_estcpu + ESTCPURAMP);
-       p2->p_interactive = 0;
-
-       /*
-        * Inherit the scheduler
+        * Inherit the scheduler and initialize scheduler-related fields. 
         */
        p2->p_usched = p1->p_usched;
+       p2->p_usched->heuristic_forking(p1, p2);
 
        /*
         * This begins the section where we must prevent the parent
index e1199d3..6dd4d5b 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.44 2005/06/25 20:03:28 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_synch.c,v 1.45 2005/06/26 04:36:31 dillon Exp $
  */
 
 #include "opt_ktrace.h"
@@ -237,6 +237,7 @@ schedcpu(void *arg)
                        continue;
                /* prevent state changes and protect run queue */
                crit_enter();
+
                /*
                 * p_cpticks runs at ESTCPUFREQ but must be divided by the
                 * load average for par-100% use.  Higher p_interactive
@@ -245,11 +246,9 @@ schedcpu(void *arg)
                 */
                if ((((fixpt_t)p->p_cpticks * cload(loadfac)) >> FSHIFT)  >
                    ESTCPUFREQ / 4) {
-                       if (p->p_interactive < 127)
-                               ++p->p_interactive;
+                       p->p_usched->heuristic_estcpu(p, 1);
                } else {
-                       if (p->p_interactive > -127)
-                               --p->p_interactive;
+                       p->p_usched->heuristic_estcpu(p, -1);
                }
                /*
                 * p_pctcpu is only for ps.
index 494d996..51032c2 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.58 2005/06/25 21:18:42 dillon Exp $
+ * $DragonFly: src/sys/sys/proc.h,v 1.59 2005/06/26 04:36:33 dillon Exp $
  */
 
 #ifndef _SYS_PROC_H_
@@ -169,7 +169,6 @@ struct      proc {
 
        /* scheduling */
        u_int           p_estcpu;       /* Time averaged value of p_cpticks. */
-       u_int           p_estcpu_fork;  /* estcpu as of fork, used in batch detect */
        int             p_cpticks;      /* Ticks of cpu time. */
        fixpt_t         p_pctcpu;       /* %cpu for this process */
        u_int           p_swtime;       /* Time swapped in or out. */
@@ -184,15 +183,13 @@ struct    proc {
 
        struct vnode    *p_textvp;      /* Vnode of executable. */
 
-       char            p_lock;         /* Process lock (prevent swap) count. */
-       short           p_priority;     /* overall priority (lower==better) */
-       char            p_rqindex;      /* Run queue index */
+       union usched_data p_usdata;     /* User scheduler specific */
        
        unsigned int    p_stops;        /* procfs event bitmask */
        unsigned int    p_stype;        /* procfs stop event type */
        char            p_step;         /* procfs stop *once* flag */
        unsigned char   p_pfsflags;     /* procfs flags */
-       char            p_pad3[2];      /* padding for alignment */
+       char            p_pad2[2];      /* padding for alignment */
        struct          sigiolst p_sigiolst;    /* list of sigio sources */
        int             p_sigparent;    /* signal to parent on exit */
        sigset_t        p_oldsigmask;   /* saved mask from before sigpause */
@@ -208,8 +205,9 @@ struct      proc {
 
        sigset_t        p_sigmask;      /* Current signal mask. */
        stack_t         p_sigstk;       /* sp & on stack state variable */
-       char            p_interactive;  /* long term interactivity par-0 */
+       char            p_lock;         /* Process lock (prevent swap) count. */
        char            p_nice;         /* Process "nice" value. */
+       char            p_pad3[2];
 
        struct pgrp     *p_pgrp;        /* Pointer to process group. */
 
index aa67302..6af09a4 100644 (file)
@@ -3,7 +3,7 @@
  *
  *     Userland scheduler API
  * 
- * $DragonFly: src/sys/sys/usched.h,v 1.1 2005/06/25 20:03:30 dillon Exp $
+ * $DragonFly: src/sys/sys/usched.h,v 1.2 2005/06/26 04:36:33 dillon Exp $
  */
 
 #ifndef _SYS_USCHED_H_
@@ -26,6 +26,23 @@ struct usched {
     void (*setrunqueue)(struct proc *);
     void (*remrunqueue)(struct proc *);
     void (*resetpriority)(struct proc *);
+    void (*heuristic_forking)(struct proc *, struct proc *);
+    void (*heuristic_exiting)(struct proc *, struct proc *);
+    void (*heuristic_estcpu)(struct proc *, int);
+};
+
+union usched_data {
+    /*
+     * BSD4 scheduler. 
+     */
+    struct {
+       short   priority;       /* lower is better */
+       char    interactive;    /* interactivity heuristic */
+       char    rqindex;
+       u_int   estcpu_fork;    /* interactivity heuristic */
+    } bsd4;
+
+    int                pad[4];         /* PAD for future expansion */
 };
 
 extern struct usched   usched_bsd4;
index 0896d29..c3575aa 100644 (file)
@@ -21,7 +21,7 @@
  *          Hiten Pandya <hmp@backplane.com>
  *
  * $FreeBSD: src/usr.bin/top/machine.c,v 1.29.2.2 2001/07/31 20:27:05 tmm Exp $
- * $DragonFly: src/usr.bin/top/machine.c,v 1.15 2005/01/14 06:00:04 cpressey Exp $
+ * $DragonFly: src/usr.bin/top/machine.c,v 1.16 2005/06/26 04:36:35 dillon Exp $
  */
 
 
@@ -611,7 +611,7 @@ char *format_next_process(caddr_t handle, char *(*get_userid)())
            namelength, namelength,
            (*get_userid)(EP(pp, e_ucred.cr_ruid)),
            (show_threads && (TP(pp, td_proc) == NULL)) ? TP(pp, td_pri) :
-               PP(pp, p_priority),
+               PP(pp, p_usdata.bsd4.priority),
            nice,
            format_k2(PROCSIZE(pp)),
            format_k2(pagetok(VP(pp, vm_rssize))),
@@ -698,7 +698,7 @@ static unsigned char sorted_state[] =
                 sorted_state[(unsigned char) PP(p1, p_stat)]) == 0)
 
 #define ORDERKEY_PRIO \
-  if ((result = PP(p2, p_priority) - PP(p1, p_priority)) == 0)
+  if ((result = PP(p2, p_usdata.bsd4.priority) - PP(p1, p_usdata.bsd4.priority)) == 0)
 
 #define ORDERKEY_KTHREADS \
   if ((result = (TP(p1, td_proc) == NULL) - (TP(p2, td_proc) == NULL)) == 0)