diff options
author | Krishna Reddy <vdumpa@nvidia.com> | 2012-07-29 15:32:14 -0700 |
---|---|---|
committer | Simone Willett <swillett@nvidia.com> | 2012-08-15 17:11:15 -0700 |
commit | a119ed4c1e0a0ffb650dd77c5d5f1b71378328c8 (patch) | |
tree | f093093fb8fc61abe0b74bf83a68d86765f72d95 | |
parent | 51efb6b201d3a0939e684ef2b530fe485da32531 (diff) |
mm: Avoid freeing init and initrd memory when CPA is enabled.
Align memblock reserve for text area to PMD size.
Reserve the memory hole between DRAM start and Page table start.
Add Sanity check to avoid section split in text area.
Bug 1028787
Change-Id: I586e4ad6e3a94aa0c79b302e51156dbe089e481f
Signed-off-by: Krishna Reddy <vdumpa@nvidia.com>
Reviewed-on: http://git-master/r/121883
(cherry picked from commit 65d02640b4b0b38263687c7f3e664c873237dc43)
Reviewed-on: http://git-master/r/123431
Reviewed-by: Simone Willett <swillett@nvidia.com>
Tested-by: Simone Willett <swillett@nvidia.com>
-rw-r--r-- | arch/arm/mm/init.c | 6 | ||||
-rw-r--r-- | arch/arm/mm/mmu.c | 2 | ||||
-rw-r--r-- | arch/arm/mm/pageattr.c | 2 |
3 files changed, 8 insertions, 2 deletions
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index 6f81c8e05c3a..cb4e96e1019d 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c @@ -339,7 +339,7 @@ void __init arm_memblock_init(struct meminfo *mi, struct machine_desc *mdesc) #ifdef CONFIG_XIP_KERNEL memblock_reserve(__pa(_sdata), _end - _sdata); #else - memblock_reserve(__pa(_stext), _end - _stext); + memblock_reserve(__pa(_stext), ALIGN(_end - _stext, PMD_SIZE)); #endif #ifdef CONFIG_BLK_DEV_INITRD if (phys_initrd_size && @@ -734,6 +734,7 @@ void __init mem_init(void) void free_initmem(void) { +#ifndef CONFIG_CPA #ifdef CONFIG_HAVE_TCM extern char __tcm_start, __tcm_end; @@ -748,6 +749,7 @@ void free_initmem(void) totalram_pages += free_area(__phys_to_pfn(__pa(__init_begin)), __phys_to_pfn(__pa(__init_end)), "init"); +#endif } #ifdef CONFIG_BLK_DEV_INITRD @@ -756,12 +758,14 @@ static int keep_initrd; void free_initrd_mem(unsigned long start, unsigned long end) { +#ifndef CONFIG_CPA if (!keep_initrd) { poison_init_mem((void *)start, PAGE_ALIGN(end) - start); totalram_pages += free_area(__phys_to_pfn(__pa(start)), __phys_to_pfn(__pa(end)), "initrd"); } +#endif } static int __init keepinitrd_setup(char *__unused) diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index bb80555edac9..992bbc52938c 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c @@ -942,7 +942,7 @@ void __init arm_mm_memblock_reserve(void) */ memblock_reserve(__pa(swapper_pg_dir), PTRS_PER_PGD * sizeof(pgd_t)); -#ifdef CONFIG_SA1111 +#if defined(CONFIG_SA1111) || defined(CONFIG_CPA) /* * Because of the SA1111 DMA bug, we want to preserve our * precious DMA-able memory... diff --git a/arch/arm/mm/pageattr.c b/arch/arm/mm/pageattr.c index 526bf59e61cc..c11064517f56 100644 --- a/arch/arm/mm/pageattr.c +++ b/arch/arm/mm/pageattr.c @@ -503,6 +503,8 @@ static int split_large_page(pte_t *kpte, unsigned long address) pgprot_t ref_prot = 0, ext_prot = 0; int ret = 0; + BUG_ON((address & PMD_MASK) < __pa(_end)); + pbase = pte_alloc_one_kernel(&init_mm, address); if (!pbase) return -ENOMEM; |