diff options
Diffstat (limited to 'arch/sparc64/mm/init.c')
| -rw-r--r-- | arch/sparc64/mm/init.c | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/arch/sparc64/mm/init.c b/arch/sparc64/mm/init.c index 217de3ea29e8..a41df7bef035 100644 --- a/arch/sparc64/mm/init.c +++ b/arch/sparc64/mm/init.c | |||
| @@ -796,6 +796,9 @@ static unsigned long nid_range(unsigned long start, unsigned long end, | |||
| 796 | start += PAGE_SIZE; | 796 | start += PAGE_SIZE; |
| 797 | } | 797 | } |
| 798 | 798 | ||
| 799 | if (start > end) | ||
| 800 | start = end; | ||
| 801 | |||
| 799 | return start; | 802 | return start; |
| 800 | } | 803 | } |
| 801 | #else | 804 | #else |
| @@ -1723,8 +1726,7 @@ void __init paging_init(void) | |||
| 1723 | 1726 | ||
| 1724 | find_ramdisk(phys_base); | 1727 | find_ramdisk(phys_base); |
| 1725 | 1728 | ||
| 1726 | if (cmdline_memory_size) | 1729 | lmb_enforce_memory_limit(cmdline_memory_size); |
| 1727 | lmb_enforce_memory_limit(phys_base + cmdline_memory_size); | ||
| 1728 | 1730 | ||
| 1729 | lmb_analyze(); | 1731 | lmb_analyze(); |
| 1730 | lmb_dump_all(); | 1732 | lmb_dump_all(); |
| @@ -1841,7 +1843,7 @@ static int pavail_rescan_ents __initdata; | |||
| 1841 | * memory list again, and make sure it provides at least as much | 1843 | * memory list again, and make sure it provides at least as much |
| 1842 | * memory as 'pavail' does. | 1844 | * memory as 'pavail' does. |
| 1843 | */ | 1845 | */ |
| 1844 | static void setup_valid_addr_bitmap_from_pavail(void) | 1846 | static void __init setup_valid_addr_bitmap_from_pavail(void) |
| 1845 | { | 1847 | { |
| 1846 | int i; | 1848 | int i; |
| 1847 | 1849 | ||
| @@ -1961,6 +1963,15 @@ void __init mem_init(void) | |||
| 1961 | void free_initmem(void) | 1963 | void free_initmem(void) |
| 1962 | { | 1964 | { |
| 1963 | unsigned long addr, initend; | 1965 | unsigned long addr, initend; |
| 1966 | int do_free = 1; | ||
| 1967 | |||
| 1968 | /* If the physical memory maps were trimmed by kernel command | ||
| 1969 | * line options, don't even try freeing this initmem stuff up. | ||
| 1970 | * The kernel image could have been in the trimmed out region | ||
| 1971 | * and if so the freeing below will free invalid page structs. | ||
| 1972 | */ | ||
| 1973 | if (cmdline_memory_size) | ||
| 1974 | do_free = 0; | ||
| 1964 | 1975 | ||
| 1965 | /* | 1976 | /* |
| 1966 | * The init section is aligned to 8k in vmlinux.lds. Page align for >8k pagesizes. | 1977 | * The init section is aligned to 8k in vmlinux.lds. Page align for >8k pagesizes. |
| @@ -1975,13 +1986,16 @@ void free_initmem(void) | |||
| 1975 | ((unsigned long) __va(kern_base)) - | 1986 | ((unsigned long) __va(kern_base)) - |
| 1976 | ((unsigned long) KERNBASE)); | 1987 | ((unsigned long) KERNBASE)); |
| 1977 | memset((void *)addr, POISON_FREE_INITMEM, PAGE_SIZE); | 1988 | memset((void *)addr, POISON_FREE_INITMEM, PAGE_SIZE); |
| 1978 | p = virt_to_page(page); | ||
| 1979 | 1989 | ||
| 1980 | ClearPageReserved(p); | 1990 | if (do_free) { |
| 1981 | init_page_count(p); | 1991 | p = virt_to_page(page); |
| 1982 | __free_page(p); | 1992 | |
| 1983 | num_physpages++; | 1993 | ClearPageReserved(p); |
| 1984 | totalram_pages++; | 1994 | init_page_count(p); |
| 1995 | __free_page(p); | ||
| 1996 | num_physpages++; | ||
| 1997 | totalram_pages++; | ||
| 1998 | } | ||
| 1985 | } | 1999 | } |
| 1986 | } | 2000 | } |
| 1987 | 2001 | ||
