]> Zhao Yanbai Git Server - minix.git/commitdiff
impove memory accounting 19/319/3
authorBen Gras <ben@minix3.org>
Fri, 8 Feb 2013 18:11:42 +0000 (19:11 +0100)
committerBen Gras <ben@minix3.org>
Mon, 11 Feb 2013 18:31:57 +0000 (19:31 +0100)
. the total amount of memory in the system didn't include the memory
  used by the boot-time modules and some dynamic allocation by the
  kernel at boot time (to map in VM). especially apparent on our
  ARM board with 'only' 512MB of memory and a huge ramdisk.
. also: *add* the VM loaded module to the freelist after it has
  been allocated for & mapped in instead of cutting it *out* of the
  freelist! so we get a few more MB free..

Change-Id: If37ac32b21c9d38610830e21421264da4f20bc4f

include/minix/param.h
kernel/arch/earm/pg_utils.c
kernel/arch/earm/pre_init.c
kernel/arch/earm/protect.c
kernel/arch/i386/pg_utils.c
kernel/arch/i386/pre_init.c
kernel/arch/i386/protect.c
servers/vm/alloc.c
servers/vm/main.c
servers/vm/proto.h
servers/vm/region.c

index 104d7b01641120520396813f98aac8d94f793e34..90a8b167619d4cc94368eaa80fe9c4df9f5dafd0 100644 (file)
@@ -41,7 +41,8 @@ typedef struct kinfo {
         char release[6];        /* kernel release number */
         char version[6];        /* kernel version number */
        int vm_allocated_bytes; /* allocated by kernel to load vm */
-       int kernel_allocated_bytes;     /* used by kernel */
+       int kernel_allocated_bytes;             /* used by kernel */
+       int kernel_allocated_bytes_dynamic;     /* used by kernel (runtime) */
 } kinfo_t;
 
 #endif
index ad333a9a0abf68bf30e85c0c3a1024f48b32acd3..2908a7a802f33c635070f6f4e216345d38f6e5dc 100644 (file)
@@ -67,26 +67,6 @@ void cut_memmap(kinfo_t *cbi, phys_bytes start, phys_bytes end)
         }
 }
 
-phys_bytes alloc_lowest(kinfo_t *cbi, phys_bytes len)
-{
-       /* Allocate the lowest physical page we have. */
-       int m;
-#define EMPTY 0xffffffff
-       phys_bytes lowest = EMPTY;
-       assert(len > 0);
-       len = roundup(len, ARM_PAGE_SIZE);
-
-       assert(kernel_may_alloc);
-
-       for(m = 0; m < cbi->mmap_size; m++) {
-               if(cbi->memmap[m].len < len) continue;
-               if(cbi->memmap[m].addr < lowest) lowest = cbi->memmap[m].addr;
-       }
-       assert(lowest != EMPTY);
-       cut_memmap(cbi, lowest, len);
-       return lowest;
-}
-
 void add_memmap(kinfo_t *cbi, u64_t addr, u64_t len)
 {
         int m;
@@ -157,6 +137,8 @@ phys_bytes pg_alloc_page(kinfo_t *cbi)
                mmap->addr += ARM_PAGE_SIZE;
                mmap->len  -= ARM_PAGE_SIZE;
 
+               cbi->kernel_allocated_bytes_dynamic += ARM_PAGE_SIZE;
+
                return addr;
        }
 
index 4d9663434a9f1bbefca5d6a5ee43f092d38ba879..626aa6a539dc6c28c3ef7b1b3acba183f32e3045 100644 (file)
@@ -106,8 +106,8 @@ int overlaps(multiboot_module_t *mod, int n, int cmp_mod)
 #define MB_PARAM_MOD  0x96000000
 #define MB_MODS_ALIGN 0x00800000 /*  8 MB */
 #define MB_MODS_SIZE  0x00004000 /* 16 KB */
-#define MB_MMAP_START MB_MODS_BASE
-#define MB_MMAP_SIZE  0x10000000 /* 256 MB */
+#define MB_MMAP_START 0x80000000
+#define MB_MMAP_SIZE  0x20000000 /* 512 MB */
 
 multiboot_module_t mb_modlist[MB_MODS_NR];
 multiboot_memory_map_t mb_memmap;
@@ -204,6 +204,7 @@ void get_parameters(u32_t ebx, kinfo_t *cbi)
         * still needed but will be freed after bootstrapping.
         */
        kinfo.kernel_allocated_bytes = (phys_bytes) &_kern_size;
+       kinfo.kernel_allocated_bytes -= cbi->bootstrap_len;
 
        assert(!(cbi->bootstrap_start % ARM_PAGE_SIZE));
        cbi->bootstrap_len = rounddown(cbi->bootstrap_len, ARM_PAGE_SIZE);
index 7a6f759b2c4f924efa4c8f79612e174d5cad7846..fd8b41617bd800ef21d879b87777942489acebff 100644 (file)
@@ -151,7 +151,8 @@ void arch_boot_proc(struct boot_image *ip, struct proc *rp)
                arch_proc_init(rp, execi.pc, kinfo.user_sp - 3*4, ip->proc_name);
 
                /* Free VM blob that was just copied into existence. */
-               cut_memmap(&kinfo, mod->mod_start, mod->mod_end);
+               add_memmap(&kinfo, mod->mod_start, mod->mod_end-mod->mod_start);
+               mod->mod_end = mod->mod_start = 0;
 
                /* Remember them */
                kinfo.vm_allocated_bytes = alloc_for_vm;
index f76ba516ac95961af8b209ea78e768e0b242cefc..444df1f9051c7530d1a3fcc5d0fef2376f8e67fd 100644 (file)
@@ -81,6 +81,7 @@ phys_bytes alloc_lowest(kinfo_t *cbi, phys_bytes len)
        }
        assert(lowest != EMPTY);
        cut_memmap(cbi, lowest, len);
+       cbi->kernel_allocated_bytes_dynamic += len;
        return lowest;
 }
 
@@ -152,6 +153,8 @@ phys_bytes pg_alloc_page(kinfo_t *cbi)
 
                mmap->len -= I386_PAGE_SIZE;
 
+                cbi->kernel_allocated_bytes_dynamic += I386_PAGE_SIZE;
+
                return mmap->addr + mmap->len;
        }
 
index 03e068fc24b6ac6effc7b234113b3578f62b6a20..8701a21a7b655a7a46ab8671329a32369feabd78 100644 (file)
@@ -164,6 +164,7 @@ void get_parameters(u32_t ebx, kinfo_t *cbi)
         * still needed but will be freed after bootstrapping.
         */
        kinfo.kernel_allocated_bytes = (phys_bytes) &_kern_size;
+       kinfo.kernel_allocated_bytes -= cbi->bootstrap_len;
 
        assert(!(cbi->bootstrap_start % I386_PAGE_SIZE));
        cbi->bootstrap_len = rounddown(cbi->bootstrap_len, I386_PAGE_SIZE);
index 7594e23613fd10dfeab9219604c7f7fa55f1ff9c..fe9d23f3fbe68562780f6d84584f1eaba23152b7 100644 (file)
@@ -428,7 +428,8 @@ void arch_boot_proc(struct boot_image *ip, struct proc *rp)
                arch_proc_init(rp, execi.pc, kinfo.user_sp - 3*4, ip->proc_name);
 
                /* Free VM blob that was just copied into existence. */
-               cut_memmap(&kinfo, mod->mod_start, mod->mod_end);
+               add_memmap(&kinfo, mod->mod_start, mod->mod_end-mod->mod_start);
+                mod->mod_end = mod->mod_start = 0;
 
                /* Remember them */
                kinfo.vm_allocated_bytes = alloc_for_vm;
index bc296b6a4c428e2448e5fec179e928b9139ffc34..fcd9eb0c9b9b8f06351ce0cff4bc632fa8b32119 100644 (file)
@@ -97,6 +97,11 @@ phys_clicks alloc_mem(phys_clicks clicks, u32_t memflags)
   return mem;
 }
 
+void mem_add_total_pages(int pages)
+{
+       total_pages += pages;
+}
+
 /*===========================================================================*
  *                             free_mem                                     *
  *===========================================================================*/
index f2b7c2f5f50cf0a856dfef4358a4806d3169dab1..3a64b2e322d7f4850ab7631b8c4fd27ccf34249b 100644 (file)
@@ -306,6 +306,8 @@ void init_vm(void)
        static struct memory mem_chunks[NR_MEMS];
        static struct boot_image *ip;
        extern void __minix_init(void);
+       multiboot_module_t *mod;
+       vir_bytes kern_dyn, kern_static;
 
 #if SANITYCHECKS
        incheck = nocheck = 0;
@@ -344,6 +346,21 @@ void init_vm(void)
        init_proc(VM_PROC_NR);
        pt_init();
 
+       /* The kernel's freelist does not include boot-time modules; let
+        * the allocator know that the total memory is bigger.
+        */
+       for (mod = &kernel_boot_info.module_list[0];
+               mod < &kernel_boot_info.module_list[kernel_boot_info.mods_with_kernel-1]; mod++) {
+               phys_bytes len = mod->mod_end-mod->mod_start+1;
+               len = roundup(len, VM_PAGE_SIZE);
+               mem_add_total_pages(len/VM_PAGE_SIZE);
+       }
+
+       kern_dyn = kernel_boot_info.kernel_allocated_bytes_dynamic;
+       kern_static = kernel_boot_info.kernel_allocated_bytes;
+       kern_static = roundup(kern_static, VM_PAGE_SIZE);
+       mem_add_total_pages((kern_dyn + kern_static)/VM_PAGE_SIZE);
+
        /* Give these processes their own page table. */
        for (ip = &kernel_boot_info.boot_procs[0];
                ip < &kernel_boot_info.boot_procs[NR_BOOT_PROCS]; ip++) {
index 1882cafe9a0daf0590e419d3ef3bcc368111ea6e..d49057de5c2b5437ea94740851e2c47f5e10858f 100644 (file)
@@ -26,6 +26,7 @@ void usedpages_reset(void);
 int usedpages_add_f(phys_bytes phys, phys_bytes len, char *file, int
        line);
 void free_mem(phys_clicks base, phys_clicks clicks);
+void mem_add_total_pages(int pages);
 #define usedpages_add(a, l) usedpages_add_f(a, l, __FILE__, __LINE__)
 
 void mem_init(struct memory *chunks);
index efb9bc4153cfa53ab8628ced0cdd022213ed1934..16f76a20c7c3e2a8e3d0debedc39b48e4a1c72d9 100644 (file)
@@ -1462,7 +1462,8 @@ void get_stats_info(struct vm_stats_info *vsi)
 void get_usage_info_kernel(struct vm_usage_info *vui)
 {
        memset(vui, 0, sizeof(*vui));
-       vui->vui_total = kernel_boot_info.kernel_allocated_bytes;
+       vui->vui_total = kernel_boot_info.kernel_allocated_bytes +
+               kernel_boot_info.kernel_allocated_bytes_dynamic;
 }
 
 static void get_usage_info_vm(struct vm_usage_info *vui)