linux-mips
[Top] [All Lists]

Re: Unused memory

To: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
Subject: Re: Unused memory
From: ralf@uni-koblenz.de
Date: Mon, 11 Jan 1999 00:48:48 +0100
Cc: linux@cthulhu.engr.sgi.com, linux-mips@fnet.fr, linux-mips@vger.rutgers.edu
In-reply-to: <19990110172259.A2057@alpha.franken.de>; from Thomas Bogendoerfer on Sun, Jan 10, 1999 at 05:22:59PM +0100
References: <19990110172259.A2057@alpha.franken.de>
Sender: owner-linux@cthulhu.engr.sgi.com
On Sun, Jan 10, 1999 at 05:22:59PM +0100, Thomas Bogendoerfer wrote:

> I now know the reason for this. Before giving out memory via brk() the
> kernel checks, whether there is enough memory. The kernel holds back
> (2 + page_cache.min_percent + buffer_mem.min_pecent) percent of the
> available memory (see function vm_enough_memory() in mm/mmap.c). Problem
> on the Indy is, that num_physpages is wrong by 128MB, because we account
> the memory by only looking at the highest page number and forget about 
> holes in the memory map. And the Indy has a big hole between 0x80002000 
> and 0x88002000 ...
> 
> Right now I can't think of a good fix for this problem. Any ideas ?

Attached is a quickfix which just fixes the calculation of num_physpages.
The real thing is to us the PG_skip flag and implement the PageSkip macro.
See the Sparc / Sparc64 code for how to implement.  Implementing this
will save us alot of memory as well.  I'll post a real patch later.

  Ralf

--- arch/mips/mm/init.c.orig    Sun Jan 10 23:50:12 1999
+++ arch/mips/mm/init.c Sun Jan 10 23:50:53 1999
@@ -247,8 +247,9 @@
 #endif
 
        end_mem &= PAGE_MASK;
-       max_mapnr = num_physpages = MAP_NR(end_mem);
+       max_mapnr = MAP_NR(end_mem);
        high_memory = (void *)end_mem;
+       num_physpages = 0;
 
        /* mark usable pages in the mem_map[] */
        start_mem = PAGE_ALIGN(start_mem);
@@ -278,6 +279,7 @@
                                datapages++;
                        continue;
                }
+               num_physpages++;
                atomic_set(&mem_map[MAP_NR(tmp)].count, 1);
 #ifdef CONFIG_BLK_DEV_INITRD
                if (!initrd_start || (tmp < initrd_start || tmp >=

<Prev in Thread] Current Thread [Next in Thread>