summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKrishna Reddy <vdumpa@nvidia.com>2012-07-29 15:32:14 -0700
committerSimone Willett <swillett@nvidia.com>2012-08-15 17:11:15 -0700
commita119ed4c1e0a0ffb650dd77c5d5f1b71378328c8 (patch)
treef093093fb8fc61abe0b74bf83a68d86765f72d95
parent51efb6b201d3a0939e684ef2b530fe485da32531 (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.c6
-rw-r--r--arch/arm/mm/mmu.c2
-rw-r--r--arch/arm/mm/pageattr.c2
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;