]> Zhao Yanbai Git Server - minix.git/commitdiff
. load average calculation changed to calculate it all over every tick
authorBen Gras <ben@minix3.org>
Thu, 16 Mar 2006 09:33:35 +0000 (09:33 +0000)
committerBen Gras <ben@minix3.org>
Thu, 16 Mar 2006 09:33:35 +0000 (09:33 +0000)
   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

include/minix/type.h
include/unistd.h
kernel/clock.c
kernel/main.c
kernel/proc.c
kernel/start.c
servers/pm/misc.c

index e44e91c1245ca9f491391f177912d44238163ceb..06a398be6304a5461f99315818eb4905c9777a6d 100755 (executable)
@@ -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;
index af796bba102a35fc9b18e8a94da7b946e9bb8c44..d9aa9ed758b44c86cf7ff8b66d0fead5b6341fae 100755 (executable)
@@ -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 <unistd.h> according to POSIX Sec. 2.7.1. */
 #define NULL    ((void *)0)
index 3eaed06542a3b3e1e6382ed6c71c3299cdac588d..cfdc151f3791855e686156e67cef461b15c77ab8 100755 (executable)
@@ -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;
index 001ec6d704f6c51dfe397349b88db53921cbddfb..33bf1e71f4f3d0fc5f675ee4d07e55bcd7c7e3bf 100755 (executable)
@@ -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, 
index 138126e03ac4f7258941e82e1aa9c5fa855ea440..6f92ad8b500aa5be8b9a4c2a5dc483573cdb8a63 100755 (executable)
@@ -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
 }
 
index f137f4c6e80bda5c565ce781c273a277f3df49e7..b77e0342f7b1f5f542b549497649076de78f2d2b 100755 (executable)
@@ -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;
index af9c2e6342c6e3766612cedd6bea7347c0a8e555..f5736110a8cfd600b6d58e3a7931523b9e1b38e5 100644 (file)
@@ -23,6 +23,7 @@
 #include <lib.h>
 #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);
 }
 
 /*===========================================================================*