From: Tang Chen Date: Thu, 7 Feb 2013 01:26:27 +0000 (+1100) Subject: Bug fix: Do not free direct mapping pages twice. X-Git-Tag: next-20130218~1^2~451 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=07a3735ef8dd8976253231a18e0dac062bd3ee0b;p=karo-tx-linux.git Bug fix: Do not free direct mapping pages twice. Direct mapped pages were freed when they were offlined, or they were not allocated. So we only need to free vmemmap pages, no need to free direct mapped pages. Signed-off-by: Tang Chen Cc: Wen Congyang Cc: Yasuaki Ishimatsu Cc: Tang Chen Cc: Kamezawa Hiroyuki Signed-off-by: Andrew Morton --- diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index 56bedb1a8224..841816abc1b3 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c @@ -829,6 +829,10 @@ remove_pte_table(pte_t *pte_start, unsigned long addr, unsigned long end, if (IS_ALIGNED(addr, PAGE_SIZE) && IS_ALIGNED(next, PAGE_SIZE)) { + /* + * Do not free direct mapping pages since they were + * freed when offlining. + */ if (!direct) free_pagetable(pte_page(*pte), 0); @@ -844,10 +848,11 @@ remove_pte_table(pte_t *pte_start, unsigned long addr, unsigned long end, * remove the page when it is wholly filled with 0xFD. */ memset((void *)addr, PAGE_INUSE, next - addr); - page_addr = page_address(pte_page(*pte)); + page_addr = page_address(pte_page(*pte)); if (!memchr_inv(page_addr, PAGE_INUSE, PAGE_SIZE)) { - free_pagetable(pte_page(*pte), 0); + if (!direct) + free_pagetable(pte_page(*pte), 0); spin_lock(&init_mm.page_table_lock); pte_clear(&init_mm, addr, pte);