diff options
Diffstat (limited to 'sys/kern/kern_synch.c')
-rw-r--r-- | sys/kern/kern_synch.c | 53 |
1 files changed, 23 insertions, 30 deletions
diff --git a/sys/kern/kern_synch.c b/sys/kern/kern_synch.c index 8473adee..892f8bb 100644 --- a/sys/kern/kern_synch.c +++ b/sys/kern/kern_synch.c @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)kern_synch.c 8.9 (Berkeley) 5/19/95 - * $Id: kern_synch.c,v 1.73 1999/02/22 16:57:47 bde Exp $ + * $Id: kern_synch.c,v 1.74 1999/02/28 10:53:29 bde Exp $ */ #include "opt_ktrace.h" @@ -64,43 +64,37 @@ static void rqinit __P((void *)); SYSINIT(runqueue, SI_SUB_RUN_QUEUE, SI_ORDER_FIRST, rqinit, NULL) +static void sched_setup __P((void *dummy)); +SYSINIT(sched_setup, SI_SUB_KICK_SCHEDULER, SI_ORDER_FIRST, sched_setup, NULL) -u_char curpriority; /* usrpri of curproc */ +u_char curpriority; int hogticks; -int lbolt; /* once a second sleep address */ +int lbolt; +int sched_quantum; /* Roundrobin scheduling quantum in ticks. */ static void endtsleep __P((void *)); static void roundrobin __P((void *arg)); static void schedcpu __P((void *arg)); static void updatepri __P((struct proc *p)); -#define MAXIMUM_SCHEDULE_QUANTUM (1000000) /* arbitrary limit */ -#ifndef DEFAULT_SCHEDULE_QUANTUM -#define DEFAULT_SCHEDULE_QUANTUM 10 -#endif -static int quantum = DEFAULT_SCHEDULE_QUANTUM; /* default value */ - static int sysctl_kern_quantum SYSCTL_HANDLER_ARGS { - int error; - int new_val = quantum; + int error, new_val; - new_val = quantum; + new_val = sched_quantum * tick; error = sysctl_handle_int(oidp, &new_val, 0, req); - if (error == 0) { - if ((new_val > 0) && (new_val < MAXIMUM_SCHEDULE_QUANTUM)) { - quantum = new_val; - } else { - error = EINVAL; - } - } - hogticks = 2 * (hz / quantum); - return (error); + if (error != 0 || req->newptr == NULL) + return (error); + if (new_val < tick) + return (EINVAL); + sched_quantum = new_val / tick; + hogticks = 2 * sched_quantum; + return (0); } SYSCTL_PROC(_kern, OID_AUTO, quantum, CTLTYPE_INT|CTLFLAG_RW, - 0, sizeof quantum, sysctl_kern_quantum, "I", ""); + 0, sizeof sched_quantum, sysctl_kern_quantum, "I", ""); /* maybe_resched: Decide if you need to reschedule or not * taking the priorities and schedulers into account. @@ -126,10 +120,10 @@ static void maybe_resched(struct proc *chk) } } -#define ROUNDROBIN_INTERVAL (hz / quantum) -int roundrobin_interval(void) +int +roundrobin_interval(void) { - return ROUNDROBIN_INTERVAL; + return (sched_quantum); } /* @@ -152,7 +146,7 @@ roundrobin(arg) need_resched(); #endif - timeout(roundrobin, NULL, ROUNDROBIN_INTERVAL); + timeout(roundrobin, NULL, sched_quantum); } /* @@ -358,11 +352,12 @@ static TAILQ_HEAD(slpquehead, proc) slpque[TABLESIZE]; int safepri; void -sleepinit() +sleepinit(void) { int i; - hogticks = 2 * (hz / quantum); + sched_quantum = hz/10; + hogticks = 2 * sched_quantum; for (i = 0; i < TABLESIZE; i++) TAILQ_INIT(&slpque[i]); } @@ -915,7 +910,6 @@ resetpriority(p) } /* ARGSUSED */ -static void sched_setup __P((void *dummy)); static void sched_setup(dummy) void *dummy; @@ -924,5 +918,4 @@ sched_setup(dummy) roundrobin(NULL); schedcpu(NULL); } -SYSINIT(sched_setup, SI_SUB_KICK_SCHEDULER, SI_ORDER_FIRST, sched_setup, NULL) |