]> Zhao Yanbai Git Server - minix.git/commitdiff
PM: added possibility to copy hole list from alloc.c to outside, for
authorBen Gras <ben@minix3.org>
Thu, 13 Oct 2005 12:48:43 +0000 (12:48 +0000)
committerBen Gras <ben@minix3.org>
Thu, 13 Oct 2005 12:48:43 +0000 (12:48 +0000)
    misc.c to copy it away by getsysinfo
IS: prints out hole list + stats such as largest contiguous chunk

servers/is/dmp.c
servers/is/dmp_pm.c
servers/is/is.c
servers/is/proto.h
servers/pm/alloc.c
servers/pm/misc.c
servers/pm/proto.h

index 21f34813fa0f39de700fd3da56c06046c781e315..5fe7cdd7ca43a0c5586d83bed5ab178af7accf2d 100644 (file)
@@ -9,7 +9,7 @@
 
 #include "is.h"
 
-#define NHOOKS 17
+#define NHOOKS 18
 
 struct hook_entry {
        int key;
@@ -33,6 +33,7 @@ struct hook_entry {
        { SF4,  dtab_dmp, "Device/Driver mapping" },
        { SF5,  mapping_dmp, "Print key mappings" },
        { SF6,  rproc_dmp, "Reincarnation server process table" },
+       { SF7,  holes_dmp, "Memory free list" },
 };
 
 /*===========================================================================*
@@ -53,7 +54,7 @@ PUBLIC int do_fkey_pressed(message *m)
   if (OK != (s=sendrec(TTY_PROC_NR, m)))
       report("IS", "warning, sendrec to TTY failed", s);
 
-  /* Now check which keys were pressed: F1-F12. */
+  /* Now check which keys were pressed: F1-F12, SF1-SF12. */
   for(h = 0; h < NHOOKS; h++)
        if(pressed(hooks[h].key))
                hooks[h].function();
index 596ef7f293961b14d50af15177bea6ad63636bba..4cfe479bbd7b55d94d0aec43b9f6e7d2bf691f5c 100644 (file)
@@ -10,6 +10,8 @@
 #include "is.h"
 #include "../pm/mproc.h"
 #include <timers.h> 
+#include <minix/config.h> 
+#include <minix/type.h> 
 
 PUBLIC struct mproc mproc[NR_PROCS];
 
@@ -97,3 +99,39 @@ PUBLIC void sigaction_dmp()
   prev_i = i;
 }
 
+/*===========================================================================*
+ *                             holes_dmp                                    *
+ *===========================================================================*/
+PUBLIC void holes_dmp(void)
+{
+       static struct hole holes[_NR_HOLES];
+       int h;
+       int largest_bytes = 0, total_bytes = 0;
+
+       if(getsysinfo(PM_PROC_NR, SI_MEM_ALLOC, holes) != OK) {
+               printf("Obtaining memory hole list failed.\n");
+               return;
+       }
+       printf("Available memory stats\n");
+
+       for(h = 0; h < _NR_HOLES; h++) {
+               if(holes[h].h_base && holes[h].h_len) {
+                       int bytes;
+                       bytes = (holes[h].h_len << CLICK_SHIFT);
+                       printf("%08lx: %6d kB\n",
+                               holes[h].h_base << CLICK_SHIFT, bytes / 1024);
+                       if(bytes > largest_bytes) largest_bytes = bytes;
+                       total_bytes += bytes;
+               }
+       }
+       printf("\nTotal memory free: %d kB\n"
+               "Largest contiguous chunk: %d kB\n"
+               "Uncontiguous rest: %d kB (%d%% of total free)\n",
+               total_bytes/1024,
+               largest_bytes/1024,
+               (total_bytes-largest_bytes)/1024,
+               100*(total_bytes/100-largest_bytes/100)/total_bytes);
+
+       return;
+}
+
index 087c326df10a7777d7f8c4c4f0eb8017aa8cf964..e65d54c00da5a13aad372ce8206806945264d6fc 100644 (file)
@@ -97,7 +97,7 @@ PRIVATE void init_server(int argc, char **argv)
   /* Set key mappings. IS takes all of F1-F12 and Shift+F1-F6. */
   fkeys = sfkeys = 0;
   for (i=1; i<=12; i++) bit_set(fkeys, i);
-  for (i=1; i<= 6; i++) bit_set(sfkeys, i);
+  for (i=1; i<= 7; i++) bit_set(sfkeys, i);
   if ((s=fkey_map(&fkeys, &sfkeys)) != OK)
       report("IS", "warning, fkey_map failed:", s);
 }
@@ -116,7 +116,7 @@ PRIVATE void exit_server()
    */
   fkeys = sfkeys = 0;
   for (i=1; i<=12; i++) bit_set(fkeys, i);
-  for (i=1; i<= 6; i++) bit_set(sfkeys, i);
+  for (i=1; i<= 7; i++) bit_set(sfkeys, i);
   if ((s=fkey_unmap(&fkeys, &sfkeys)) != OK)
       report("IS", "warning, unfkey_map failed:", s);
 
index 43f15cb69c9dafb1f8eaeaa22af551688d4f0c9d..a464a4b68b9bd7a171fa8b0554c779e65e411060 100644 (file)
@@ -24,6 +24,7 @@ _PROTOTYPE( void timing_dmp, (void)                                   );
 /* dmp_pm.c */
 _PROTOTYPE( void mproc_dmp, (void)                                     );
 _PROTOTYPE( void sigaction_dmp, (void)                                 );
+_PROTOTYPE( void holes_dmp, (void)                                     );
 
 /* dmp_fs.c */
 _PROTOTYPE( void dtab_dmp, (void)                                      );
index edb8e8fcf49a2f27e79fe636c8b16ea7c67880d8..0cc9e1fae7b85caed4600e805c3407b281ff53d9 100644 (file)
  *   free_mem: release a previously allocated chunk of memory
  *   mem_init: initialize the tables when PM start up
  *   max_hole: returns the largest hole currently available
+ *   mem_holes_copy: for outsiders who want a copy of the hole-list
  */
 
 #include "pm.h"
 #include <minix/com.h>
 #include <minix/callnr.h>
+#include <minix/type.h>
+#include <minix/config.h>
 #include <signal.h>
 #include <stdlib.h>
+#include <string.h>
 #include "mproc.h"
 #include "../../kernel/const.h"
 #include "../../kernel/config.h"
 #include "../../kernel/type.h"
 
-#define NR_HOLES  (2*NR_PROCS) /* max # entries in hole table */
 #define NIL_HOLE (struct hole *) 0
 
-PRIVATE struct hole {
-  struct hole *h_next;         /* pointer to next entry on the list */
-  phys_clicks h_base;          /* where does the hole begin? */
-  phys_clicks h_len;           /* how big is the hole? */
-} hole[NR_HOLES];
+PRIVATE struct hole hole[_NR_HOLES];
 
 PRIVATE struct hole *hole_head;        /* pointer to first hole */
 PRIVATE struct hole *free_slots;/* ptr to list of unused table slots */
@@ -161,6 +160,7 @@ register struct hole *hp;
        prev_ptr->h_next = hp->h_next;
 
   hp->h_next = free_slots;
+  hp->h_base = hp->h_len = 0;
   free_slots = hp;
 }
 
@@ -218,8 +218,11 @@ phys_clicks *free;         /* memory size summaries */
   register struct hole *hp;
 
   /* Put all holes on the free list. */
-  for (hp = &hole[0]; hp < &hole[NR_HOLES]; hp++) hp->h_next = hp + 1;
-  hole[NR_HOLES-1].h_next = NIL_HOLE;
+  for (hp = &hole[0]; hp < &hole[_NR_HOLES]; hp++) {
+       hp->h_next = hp + 1;
+       hp->h_base = hp->h_len = 0;
+  }
+  hole[_NR_HOLES-1].h_next = NIL_HOLE;
   hole_head = NIL_HOLE;
   free_slots = &hole[0];
 
@@ -247,6 +250,17 @@ phys_clicks *free;         /* memory size summaries */
 #endif
 }
 
+/*===========================================================================*
+ *                             mem_holes_copy                               *
+ *===========================================================================*/
+PUBLIC int mem_holes_copy(struct hole *holecopies, size_t *bytes)
+{
+       if(*bytes < sizeof(hole)) return ENOSPC;
+       memcpy(holecopies, hole, sizeof(hole));
+       *bytes = sizeof(hole);
+       return OK;
+}
+
 #if ENABLE_SWAP
 /*===========================================================================*
  *                             swap_on                                      *
index 0364e59757a957ae2f5b0a78256324217d0b1a62..897fe8d1d8f4927a97c53f127e2b3c20b179df2a 100644 (file)
@@ -16,6 +16,8 @@
 #include <sys/svrctl.h>
 #include <sys/resource.h>
 #include <minix/com.h>
+#include <minix/config.h>
+#include <minix/type.h>
 #include <string.h>
 #include "mproc.h"
 #include "param.h"
@@ -58,7 +60,9 @@ PUBLIC int do_getsysinfo()
   vir_bytes src_addr, dst_addr;
   struct kinfo kinfo;
   size_t len;
-  int s;
+  static struct hole holes[_NR_HOLES];
+  int s, r;
+  size_t holesize;
 
   switch(m_in.info_what) {
   case SI_KINFO:                       /* kernel info is obtained via PM */
@@ -75,6 +79,12 @@ PUBLIC int do_getsysinfo()
         src_addr = (vir_bytes) mproc;
         len = sizeof(struct mproc) * NR_PROCS;
         break;
+  case SI_MEM_ALLOC:
+       holesize = sizeof(holes);
+       if((r=mem_holes_copy(holes, &holesize)) != OK) return r;
+       src_addr = (vir_bytes) holes;
+       len = holesize;
+       break;
   default:
        return(EINVAL);
   }
index 49a1e4dd28dc19ff93dab3415eefbdfe64c1e335..bd358ea09c453ca651da6c0d561819b84a46401f 100644 (file)
@@ -20,6 +20,7 @@ _PROTOTYPE( void swap_inqueue, (struct mproc *rmp)                    );
 #define swap_in()                      ((void)0)
 #define swap_inqueue(rmp)              ((void)0)
 #endif /* !SWAP */
+_PROTOTYPE(int mem_holes_copy, (struct hole *, size_t *)               );
 
 /* break.c */
 _PROTOTYPE( int adjust, (struct mproc *rmp,