From: Ben Gras Date: Thu, 16 Mar 2006 09:33:35 +0000 (+0000) Subject: . load average calculation changed to calculate it all over every tick X-Git-Tag: v3.1.2a~216 X-Git-Url: http://zhaoyanbai.com/repos/%22http:/www.isc.org/icons/doxygen.png?a=commitdiff_plain;h=eae250dea41aaab37af24af4acce2c4daccab28f;p=minix.git . load average calculation changed to calculate it all over every tick instead of keeping a running total of enqueued processes (because somehow the load average was broken) . added SI_KPROC_TAB to get a copy of kernel process table from PM, for a top implementation . fixed arg to sys_nice() to make it an endpoint, not a slot number --- diff --git a/include/minix/type.h b/include/minix/type.h index e44e91c12..06a398be6 100755 --- a/include/minix/type.h +++ b/include/minix/type.h @@ -121,7 +121,6 @@ struct kinfo { /* Runnable processes and other load-average information. */ struct loadinfo { - u16_t procs_enqueued; /* current no. of runnable processes */ u16_t proc_load_history[_LOAD_HISTORY]; /* history of proc_s_cur */ u16_t proc_last_slot; clock_t last_clock; diff --git a/include/unistd.h b/include/unistd.h index af796bba1..d9aa9ed75 100755 --- a/include/unistd.h +++ b/include/unistd.h @@ -46,6 +46,7 @@ #define SI_MEM_ALLOC 4 /* get memory allocation data */ #define SI_DATA_STORE 5 /* get copy of data store */ #define SI_LOADINFO 6 /* get copy of load average structure */ +#define SI_KPROC_TAB 7 /* copy of kernel process table */ /* NULL must be defined in according to POSIX Sec. 2.7.1. */ #define NULL ((void *)0) diff --git a/kernel/clock.c b/kernel/clock.c index 3eaed0654..cfdc151f3 100755 --- a/kernel/clock.c +++ b/kernel/clock.c @@ -288,6 +288,8 @@ PUBLIC unsigned long read_clock() PRIVATE void load_update(void) { u16_t slot; + int enqueued = -1, q; /* -1: special compensation for IDLE. */ + struct proc *p; /* Load average data is stored as a list of numbers in a circular * buffer. Each slot accumulates _LOAD_UNIT_SECS of samples of @@ -301,8 +303,12 @@ PRIVATE void load_update(void) kloadinfo.proc_last_slot = slot; } - /* Cumulation. */ - kloadinfo.proc_load_history[slot] += kloadinfo.procs_enqueued; + /* Cumulation. How many processes are ready now? */ + for(q = 0; q < NR_SCHED_QUEUES; q++) + for(p = rdy_head[q]; p != NIL_PROC; p = p->p_nextready) + enqueued++; + + kloadinfo.proc_load_history[slot] += enqueued; /* Up-to-dateness. */ kloadinfo.last_clock = realtime; diff --git a/kernel/main.c b/kernel/main.c index 001ec6d70..33bf1e71f 100755 --- a/kernel/main.c +++ b/kernel/main.c @@ -145,9 +145,6 @@ PUBLIC void main() alloc_segments(rp); } - /* Special compensation for IDLE - don't let it count in the load average. */ - kloadinfo.procs_enqueued--; - #if ENABLE_BOOTDEV /* Expect an image of the boot device to be loaded into memory as well. * The boot device is the last module that is loaded into memory, and, diff --git a/kernel/proc.c b/kernel/proc.c index 138126e03..6f92ad8b5 100755 --- a/kernel/proc.c +++ b/kernel/proc.c @@ -536,8 +536,6 @@ register struct proc *rp; /* this process is now runnable */ /* Now select the next process to run. */ pick_proc(); - kloadinfo.procs_enqueued++; - #if DEBUG_SCHED_CHECK rp->p_ready = 1; check_runqueues("enqueue"); @@ -587,13 +585,9 @@ register struct proc *rp; /* this process is no longer runnable */ prev_xp = *xpp; /* save previous in chain */ } - kloadinfo.procs_enqueued--; - #if DEBUG_SCHED_CHECK rp->p_ready = 0; check_runqueues("dequeue"); - if(kloadinfo.procs_enqueued < 0) - kprintf("%d processes enqueued\n", kloadinfo.procs_enqueued); #endif } diff --git a/kernel/start.c b/kernel/start.c index f137f4c6e..b77e0342f 100755 --- a/kernel/start.c +++ b/kernel/start.c @@ -66,7 +66,6 @@ U16_t parmoff, parmsize; /* boot parameters offset and length */ kinfo.kmem_size = (phys_bytes) &end; /* Load average data initialization. */ - kloadinfo.procs_enqueued = 0; kloadinfo.proc_last_slot = 0; for(h = 0; h < _LOAD_HISTORY; h++) kloadinfo.proc_load_history[h] = 0; diff --git a/servers/pm/misc.c b/servers/pm/misc.c index af9c2e634..f5736110a 100644 --- a/servers/pm/misc.c +++ b/servers/pm/misc.c @@ -23,6 +23,7 @@ #include #include "mproc.h" #include "param.h" +#include "../../kernel/proc.h" /*===========================================================================* * do_allocmem * @@ -83,6 +84,7 @@ PUBLIC int do_getsysinfo() vir_bytes src_addr, dst_addr; struct kinfo kinfo; struct loadinfo loadinfo; + static struct proc proctab[NR_PROCS+NR_TASKS]; size_t len; static struct pm_mem_info pmi; int s, r; @@ -103,6 +105,12 @@ PUBLIC int do_getsysinfo() src_addr = (vir_bytes) mproc; len = sizeof(struct mproc) * NR_PROCS; break; + case SI_KPROC_TAB: /* copy entire process table */ + if((r=sys_getproctab(proctab)) != OK) + return r; + src_addr = (vir_bytes) proctab; + len = sizeof(proctab); + break; case SI_MEM_ALLOC: holesize = sizeof(pmi.pmi_holes); if((r=mem_holes_copy(pmi.pmi_holes, &holesize, @@ -252,7 +260,7 @@ PUBLIC int do_getsetpriority() /* We're SET, and it's allowed. Do it and tell kernel. */ rmp->mp_nice = arg_pri; - return sys_nice(rmp_nr, arg_pri); + return sys_nice(rmp->mp_endpoint, arg_pri); } /*===========================================================================*