forked from Minki/linux
0c98853473
Concentrate code to modify totalram_pages into the mm core, so the arch memory initialized code doesn't need to take care of it. With these changes applied, only following functions from mm core modify global variable totalram_pages: free_bootmem_late(), free_all_bootmem(), free_all_bootmem_node(), adjust_managed_page_count(). With this patch applied, it will be much more easier for us to keep totalram_pages and zone->managed_pages in consistence. Signed-off-by: Jiang Liu <jiang.liu@huawei.com> Acked-by: David Howells <dhowells@redhat.com> Cc: "H. Peter Anvin" <hpa@zytor.com> Cc: "Michael S. Tsirkin" <mst@redhat.com> Cc: <sworddragon2@aol.com> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Chris Metcalf <cmetcalf@tilera.com> Cc: Geert Uytterhoeven <geert@linux-m68k.org> Cc: Ingo Molnar <mingo@redhat.com> Cc: Jeremy Fitzhardinge <jeremy@goop.org> Cc: Jianguo Wu <wujianguo@huawei.com> Cc: Joonsoo Kim <js1304@gmail.com> Cc: Kamezawa Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> Cc: Marek Szyprowski <m.szyprowski@samsung.com> Cc: Mel Gorman <mel@csn.ul.ie> Cc: Michel Lespinasse <walken@google.com> Cc: Minchan Kim <minchan@kernel.org> Cc: Rik van Riel <riel@redhat.com> Cc: Rusty Russell <rusty@rustcorp.com.au> Cc: Tang Chen <tangchen@cn.fujitsu.com> Cc: Tejun Heo <tj@kernel.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Wen Congyang <wency@cn.fujitsu.com> Cc: Will Deacon <will.deacon@arm.com> Cc: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com> Cc: Yinghai Lu <yinghai@kernel.org> Cc: Russell King <rmk@arm.linux.org.uk> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
176 lines
4.4 KiB
C
176 lines
4.4 KiB
C
/*
|
|
* linux/arch/h8300/mm/init.c
|
|
*
|
|
* Copyright (C) 1998 D. Jeff Dionne <jeff@lineo.ca>,
|
|
* Kenneth Albanowski <kjahds@kjahds.com>,
|
|
* Copyright (C) 2000 Lineo, Inc. (www.lineo.com)
|
|
*
|
|
* Based on:
|
|
*
|
|
* linux/arch/m68knommu/mm/init.c
|
|
* linux/arch/m68k/mm/init.c
|
|
*
|
|
* Copyright (C) 1995 Hamish Macdonald
|
|
*
|
|
* JAN/1999 -- hacked to support ColdFire (gerg@snapgear.com)
|
|
* DEC/2000 -- linux 2.4 support <davidm@snapgear.com>
|
|
*/
|
|
|
|
#include <linux/signal.h>
|
|
#include <linux/sched.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/errno.h>
|
|
#include <linux/string.h>
|
|
#include <linux/types.h>
|
|
#include <linux/ptrace.h>
|
|
#include <linux/mman.h>
|
|
#include <linux/mm.h>
|
|
#include <linux/swap.h>
|
|
#include <linux/init.h>
|
|
#include <linux/highmem.h>
|
|
#include <linux/pagemap.h>
|
|
#include <linux/bootmem.h>
|
|
#include <linux/gfp.h>
|
|
|
|
#include <asm/setup.h>
|
|
#include <asm/segment.h>
|
|
#include <asm/page.h>
|
|
#include <asm/pgtable.h>
|
|
#include <asm/sections.h>
|
|
|
|
#undef DEBUG
|
|
|
|
/*
|
|
* BAD_PAGE is the page that is used for page faults when linux
|
|
* is out-of-memory. Older versions of linux just did a
|
|
* do_exit(), but using this instead means there is less risk
|
|
* for a process dying in kernel mode, possibly leaving a inode
|
|
* unused etc..
|
|
*
|
|
* BAD_PAGETABLE is the accompanying page-table: it is initialized
|
|
* to point to BAD_PAGE entries.
|
|
*
|
|
* ZERO_PAGE is a special page that is used for zero-initialized
|
|
* data and COW.
|
|
*/
|
|
static unsigned long empty_bad_page_table;
|
|
|
|
static unsigned long empty_bad_page;
|
|
|
|
unsigned long empty_zero_page;
|
|
|
|
extern unsigned long rom_length;
|
|
|
|
extern unsigned long memory_start;
|
|
extern unsigned long memory_end;
|
|
|
|
/*
|
|
* paging_init() continues the virtual memory environment setup which
|
|
* was begun by the code in arch/head.S.
|
|
* The parameters are pointers to where to stick the starting and ending
|
|
* addresses of available kernel virtual memory.
|
|
*/
|
|
void __init paging_init(void)
|
|
{
|
|
/*
|
|
* Make sure start_mem is page aligned, otherwise bootmem and
|
|
* page_alloc get different views og the world.
|
|
*/
|
|
#ifdef DEBUG
|
|
unsigned long start_mem = PAGE_ALIGN(memory_start);
|
|
#endif
|
|
unsigned long end_mem = memory_end & PAGE_MASK;
|
|
|
|
#ifdef DEBUG
|
|
printk ("start_mem is %#lx\nvirtual_end is %#lx\n",
|
|
start_mem, end_mem);
|
|
#endif
|
|
|
|
/*
|
|
* Initialize the bad page table and bad page to point
|
|
* to a couple of allocated pages.
|
|
*/
|
|
empty_bad_page_table = (unsigned long)alloc_bootmem_pages(PAGE_SIZE);
|
|
empty_bad_page = (unsigned long)alloc_bootmem_pages(PAGE_SIZE);
|
|
empty_zero_page = (unsigned long)alloc_bootmem_pages(PAGE_SIZE);
|
|
memset((void *)empty_zero_page, 0, PAGE_SIZE);
|
|
|
|
/*
|
|
* Set up SFC/DFC registers (user data space).
|
|
*/
|
|
set_fs (USER_DS);
|
|
|
|
#ifdef DEBUG
|
|
printk ("before free_area_init\n");
|
|
|
|
printk ("free_area_init -> start_mem is %#lx\nvirtual_end is %#lx\n",
|
|
start_mem, end_mem);
|
|
#endif
|
|
|
|
{
|
|
unsigned long zones_size[MAX_NR_ZONES] = {0, };
|
|
|
|
zones_size[ZONE_DMA] = 0 >> PAGE_SHIFT;
|
|
zones_size[ZONE_NORMAL] = (end_mem - PAGE_OFFSET) >> PAGE_SHIFT;
|
|
#ifdef CONFIG_HIGHMEM
|
|
zones_size[ZONE_HIGHMEM] = 0;
|
|
#endif
|
|
free_area_init(zones_size);
|
|
}
|
|
}
|
|
|
|
void __init mem_init(void)
|
|
{
|
|
int codek = 0, datak = 0, initk = 0;
|
|
/* DAVIDM look at setup memory map generically with reserved area */
|
|
unsigned long tmp;
|
|
extern unsigned long _ramend, _ramstart;
|
|
unsigned long len = &_ramend - &_ramstart;
|
|
unsigned long start_mem = memory_start; /* DAVIDM - these must start at end of kernel */
|
|
unsigned long end_mem = memory_end; /* DAVIDM - this must not include kernel stack at top */
|
|
|
|
#ifdef DEBUG
|
|
printk(KERN_DEBUG "Mem_init: start=%lx, end=%lx\n", start_mem, end_mem);
|
|
#endif
|
|
|
|
end_mem &= PAGE_MASK;
|
|
high_memory = (void *) end_mem;
|
|
|
|
start_mem = PAGE_ALIGN(start_mem);
|
|
max_mapnr = num_physpages = MAP_NR(high_memory);
|
|
|
|
/* this will put all low memory onto the freelists */
|
|
free_all_bootmem();
|
|
|
|
codek = (_etext - _stext) >> 10;
|
|
datak = (__bss_stop - _sdata) >> 10;
|
|
initk = (__init_begin - __init_end) >> 10;
|
|
|
|
tmp = nr_free_pages() << PAGE_SHIFT;
|
|
printk(KERN_INFO "Memory available: %luk/%luk RAM, %luk/%luk ROM (%dk kernel code, %dk data)\n",
|
|
tmp >> 10,
|
|
len >> 10,
|
|
(rom_length > 0) ? ((rom_length >> 10) - codek) : 0,
|
|
rom_length >> 10,
|
|
codek,
|
|
datak
|
|
);
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_BLK_DEV_INITRD
|
|
void free_initrd_mem(unsigned long start, unsigned long end)
|
|
{
|
|
free_reserved_area((void *)start, (void *)end, -1, "initrd");
|
|
}
|
|
#endif
|
|
|
|
void
|
|
free_initmem(void)
|
|
{
|
|
#ifdef CONFIG_RAMKERNEL
|
|
free_initmem_default(-1);
|
|
#endif
|
|
}
|
|
|