All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yinghai Lu <yinghai@kernel.org>
To: Thomas Gleixner <tglx@linutronix.de>, Ingo Molnar <mingo@elte.hu>,
	"H. Peter Anvin" <hpa@zytor.com>, Jacob Shin <jacob.shin@amd.com>,
	Tejun Heo <tj@kernel.org>
Cc: Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	linux-kernel@vger.kernel.org, Yinghai Lu <yinghai@kernel.org>
Subject: [PATCH 3/7] x86, mm: Don't clear page table if next range is ram
Date: Tue,  9 Oct 2012 16:58:31 -0700	[thread overview]
Message-ID: <1349827115-16600-4-git-send-email-yinghai@kernel.org> (raw)
In-Reply-To: <1349827115-16600-1-git-send-email-yinghai@kernel.org>

After we add code use BRK to map buffer for final page table,

It should be safe to remove early_memmap for page table accessing.

But we get panic with that.

It turns out we clear the initial page table wrongly for next range that is
separated by holes.
And it only happens when we are trying to map range one by one range separately.

After we add checking before clearing the related page table, that panic will
not happen anymore.

Signed-off-by: Yinghai Lu <yinghai@kernel.org>
---
 arch/x86/mm/init_64.c |   37 ++++++++++++++++---------------------
 1 files changed, 16 insertions(+), 21 deletions(-)

diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
index f40f383..61b3c44 100644
--- a/arch/x86/mm/init_64.c
+++ b/arch/x86/mm/init_64.c
@@ -363,20 +363,19 @@ static unsigned long __meminit
 phys_pte_init(pte_t *pte_page, unsigned long addr, unsigned long end,
 	      pgprot_t prot)
 {
-	unsigned pages = 0;
+	unsigned long pages = 0, next;
 	unsigned long last_map_addr = end;
 	int i;
 
 	pte_t *pte = pte_page + pte_index(addr);
 
-	for(i = pte_index(addr); i < PTRS_PER_PTE; i++, addr += PAGE_SIZE, pte++) {
-
+	for (i = pte_index(addr); i < PTRS_PER_PTE; i++, addr = next, pte++) {
+		next = (addr & PAGE_MASK) + PAGE_SIZE;
 		if (addr >= end) {
-			if (!after_bootmem) {
-				for(; i < PTRS_PER_PTE; i++, pte++)
-					set_pte(pte, __pte(0));
-			}
-			break;
+			if (!after_bootmem &&
+			    !e820_any_mapped(addr & PAGE_MASK, next, 0))
+				set_pte(pte, __pte(0));
+			continue;
 		}
 
 		/*
@@ -418,16 +417,14 @@ phys_pmd_init(pmd_t *pmd_page, unsigned long address, unsigned long end,
 		pte_t *pte;
 		pgprot_t new_prot = prot;
 
+		next = (address & PMD_MASK) + PMD_SIZE;
 		if (address >= end) {
-			if (!after_bootmem) {
-				for (; i < PTRS_PER_PMD; i++, pmd++)
-					set_pmd(pmd, __pmd(0));
-			}
-			break;
+			if (!after_bootmem &&
+			    !e820_any_mapped(address & PMD_MASK, next, 0))
+				set_pmd(pmd, __pmd(0));
+			continue;
 		}
 
-		next = (address & PMD_MASK) + PMD_SIZE;
-
 		if (pmd_val(*pmd)) {
 			if (!pmd_large(*pmd)) {
 				spin_lock(&init_mm.page_table_lock);
@@ -494,13 +491,11 @@ phys_pud_init(pud_t *pud_page, unsigned long addr, unsigned long end,
 		pmd_t *pmd;
 		pgprot_t prot = PAGE_KERNEL;
 
-		if (addr >= end)
-			break;
-
 		next = (addr & PUD_MASK) + PUD_SIZE;
-
-		if (!after_bootmem && !e820_any_mapped(addr, next, 0)) {
-			set_pud(pud, __pud(0));
+		if (addr >= end) {
+			if (!after_bootmem &&
+			    !e820_any_mapped(addr & PUD_MASK, next, 0))
+				set_pud(pud, __pud(0));
 			continue;
 		}
 
-- 
1.7.7


  parent reply	other threads:[~2012-10-09 23:58 UTC|newest]

Thread overview: 115+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-10-09 23:58 [PATCH -v3 0/7] x86: Use BRK to pre mapping page table to make xen happy Yinghai Lu
2012-10-09 23:58 ` [PATCH 1/7] x86, mm: align start address to correct big page size Yinghai Lu
2012-10-09 23:58 ` [PATCH 2/7] x86, mm: Use big page size for small memory range Yinghai Lu
2012-10-09 23:58 ` Yinghai Lu [this message]
2012-10-09 23:58 ` [PATCH 4/7] x86, mm: only keep initial mapping for ram Yinghai Lu
2012-10-10 13:48   ` Konrad Rzeszutek Wilk
2012-10-10 14:59     ` Yinghai Lu
2012-10-09 23:58 ` [PATCH 5/7] x86, mm: Break down init_all_memory_mapping Yinghai Lu
2012-10-10 13:55   ` Konrad Rzeszutek Wilk
2012-10-10 15:42     ` Yinghai Lu
2012-10-09 23:58 ` [PATCH 6/7] x86, mm: setup page table from top-down Yinghai Lu
2012-10-10  1:53   ` Yinghai Lu
2012-10-10 16:38   ` Stefano Stabellini
2012-10-10 17:07     ` Yinghai Lu
2012-10-10 17:26       ` Stefano Stabellini
2012-10-10 17:38         ` Yinghai Lu
2012-11-16 17:14           ` H. Peter Anvin
2012-11-16 17:16             ` Yinghai Lu
2012-10-09 23:58 ` [PATCH 7/7] x86, mm: Remove early_memremap workaround for page table accessing Yinghai Lu
2012-10-10 13:47 ` [PATCH -v3 0/7] x86: Use BRK to pre mapping page table to make xen happy Konrad Rzeszutek Wilk
2012-10-10 14:55   ` Yinghai Lu
2012-10-10 16:40 ` Stefano Stabellini
2012-10-11  6:13   ` Yinghai Lu
2012-10-11 23:04     ` Yinghai Lu
2012-10-18 16:17     ` Stefano Stabellini
2012-10-18 16:26       ` Jacob Shin
2012-10-18 16:57         ` Stefano Stabellini
2012-10-18 20:36           ` Yinghai Lu
2012-10-18 20:40         ` Yinghai Lu
2012-10-18 21:57           ` Jacob Shin
2012-10-18 20:43       ` Yinghai Lu
2012-10-30 13:44     ` Konrad Rzeszutek Wilk
2012-10-30 14:47       ` Yinghai Lu
2012-11-03 21:35         ` Yinghai Lu
2012-11-03 21:37           ` H. Peter Anvin
2012-11-05 20:25             ` Yinghai Lu
2012-11-05 20:27               ` [PATCH 39/42] x86, mm: kill numa_free_all_bootmem() Yinghai Lu
2012-11-05 20:27                 ` [PATCH 40/42] x86, mm: kill numa_64.h Yinghai Lu
2012-11-05 20:27                 ` [PATCH 41/42] sparc, mm: Remove calling of free_all_bootmem_node() Yinghai Lu
2012-11-05 20:27                   ` Yinghai Lu
2012-11-06 17:44                   ` David Miller
2012-11-06 17:44                     ` David Miller
2012-11-05 20:27                 ` [PATCH 42/42] mm: Kill NO_BOOTMEM version free_all_bootmem_node() Yinghai Lu
2012-11-07 16:11               ` [PATCH -v3 0/7] x86: Use BRK to pre mapping page table to make xen happy Konrad Rzeszutek Wilk
2012-11-08  1:40                 ` Konrad Rzeszutek Wilk
2012-11-08  4:06                   ` Yinghai Lu
2012-11-09 20:31                     ` Yinghai Lu
2012-11-12 19:30           ` Konrad Rzeszutek Wilk
2012-11-12 21:17             ` [PATCH v7 00/46] x86, mm: map ram from top-down with BRK and memblock Yinghai Lu
2012-11-12 21:17               ` [PATCH 01/46] x86, mm: Add global page_size_mask and probe one time only Yinghai Lu
2012-11-12 21:17               ` [PATCH 02/46] x86, mm: Split out split_mem_range from init_memory_mapping Yinghai Lu
2012-11-13  5:51                 ` Yasuaki Ishimatsu
2012-11-13  6:20                   ` Yinghai Lu
2012-11-13  7:03                     ` snakky.zhang
2012-11-13 18:34                       ` Yinghai Lu
2012-11-12 21:17               ` [PATCH 03/46] x86, mm: Move down find_early_table_space() Yinghai Lu
2012-11-12 21:18               ` [PATCH 04/46] x86, mm: Move init_memory_mapping calling out of setup.c Yinghai Lu
2012-11-12 21:18               ` [PATCH 05/46] x86, mm: Revert back good_end setting for 64bit Yinghai Lu
2012-11-12 21:18               ` [PATCH 06/46] x86, mm: Change find_early_table_space() paramters Yinghai Lu
2012-11-12 21:18               ` [PATCH 07/46] x86, mm: Find early page table buffer together Yinghai Lu
2012-11-12 21:18               ` [PATCH 08/46] x86, mm: Separate out calculate_table_space_size() Yinghai Lu
2012-11-12 21:18               ` [PATCH 09/46] x86, mm: Set memblock initial limit to 1M Yinghai Lu
2012-11-12 21:18               ` [PATCH 10/46] x86, mm: if kernel .text .data .bss are not marked as E820_RAM, complain and fix Yinghai Lu
2012-11-12 21:18               ` [PATCH 11/46] x86, mm: Fixup code testing if a pfn is direct mapped Yinghai Lu
2012-11-12 21:18               ` [PATCH 12/46] x86, mm: use pfn_range_is_mapped() with CPA Yinghai Lu
2012-11-12 21:18               ` [PATCH 13/46] x86, mm: use pfn_range_is_mapped() with gart Yinghai Lu
2012-11-12 21:18               ` [PATCH 14/46] x86, mm: use pfn_range_is_mapped() with reserve_initrd Yinghai Lu
2012-11-12 21:18               ` [PATCH 15/46] x86, mm: Only direct map addresses that are marked as E820_RAM Yinghai Lu
2012-11-12 21:18               ` [PATCH 16/46] x86, mm: relocate initrd under all mem for 64bit Yinghai Lu
2012-11-12 21:18               ` [PATCH 17/46] x86, mm: Align start address to correct big page size Yinghai Lu
2012-11-12 21:18               ` [PATCH 18/46] x86, mm: Use big page size for small memory range Yinghai Lu
2012-11-12 21:18               ` [PATCH 19/46] x86, mm: Don't clear page table if range is ram Yinghai Lu
2012-11-12 21:18               ` [PATCH 20/46] x86, mm: Break down init_all_memory_mapping Yinghai Lu
2012-11-12 21:18               ` [PATCH 21/46] x86, mm: setup page table in top-down Yinghai Lu
2012-11-13 17:26                 ` Stefano Stabellini
2012-11-13 19:59                   ` Yinghai Lu
2012-11-13 20:01                     ` H. Peter Anvin
2012-11-13 20:36                       ` Yinghai Lu
2012-11-15 19:28                         ` Yinghai Lu
2012-11-12 21:18               ` [PATCH 22/46] x86, mm: Remove early_memremap workaround for page table accessing on 64bit Yinghai Lu
2012-11-13 16:52                 ` Stefano Stabellini
2012-11-12 21:18               ` [PATCH 23/46] x86, mm: Remove parameter in alloc_low_page for 64bit Yinghai Lu
2012-11-13 17:40                 ` Stefano Stabellini
2012-11-12 21:18               ` [PATCH 24/46] x86, mm: Merge alloc_low_page between 64bit and 32bit Yinghai Lu
2012-11-12 21:18               ` [PATCH 25/46] x86, mm: Move min_pfn_mapped back to mm/init.c Yinghai Lu
2012-11-12 21:18               ` [PATCH 26/46] x86, mm, Xen: Remove mapping_pagetable_reserve() Yinghai Lu
2012-11-13 16:36                 ` Stefano Stabellini
2012-11-13 18:51                   ` Yinghai Lu
2012-11-14 11:19                     ` Stefano Stabellini
2012-11-12 21:18               ` [PATCH 27/46] x86, mm: Add alloc_low_pages(num) Yinghai Lu
2012-11-13 16:37                 ` Stefano Stabellini
2012-11-13 18:53                   ` Yinghai Lu
2012-11-12 21:18               ` [PATCH 28/46] x86, mm: Add pointer about Xen mmu requirement for alloc_low_pages Yinghai Lu
2012-11-13 16:38                 ` Stefano Stabellini
2012-11-13 17:56                   ` H. Peter Anvin
2012-11-13 18:58                     ` Yinghai Lu
2012-11-12 21:18               ` [PATCH 29/46] x86, mm: only call early_ioremap_page_table_range_init() once Yinghai Lu
2012-11-12 21:18               ` [PATCH 30/46] x86, mm: Move back pgt_buf_* to mm/init.c Yinghai Lu
2012-11-12 21:18               ` [PATCH 31/46] x86, mm: Move init_gbpages() out of setup.c Yinghai Lu
2012-11-12 21:18               ` [PATCH 32/46] x86, mm: change low/hignmem_pfn_init to static on 32bit Yinghai Lu
2012-11-12 21:18               ` [PATCH 33/46] x86, mm: Move function declaration into mm_internal.h Yinghai Lu
2012-11-12 21:18               ` [PATCH 34/46] x86, mm: Add check before clear pte above max_low_pfn on 32bit Yinghai Lu
2012-11-12 21:18               ` [PATCH 35/46] x86, mm: use round_up/down in split_mem_range() Yinghai Lu
2012-11-12 21:18               ` [PATCH 36/46] x86, mm: use PFN_DOWN " Yinghai Lu
2012-11-12 21:18               ` [PATCH 37/46] x86, mm: use pfn instead of pos in split_mem_range Yinghai Lu
2012-11-12 21:18               ` [PATCH 38/46] x86, mm: use limit_pfn for end pfn Yinghai Lu
2012-11-12 21:18               ` [PATCH 39/46] x86, mm: Unifying after_bootmem for 32bit and 64bit Yinghai Lu
2012-11-12 21:18               ` [PATCH 40/46] x86, mm: Move after_bootmem to mm_internel.h Yinghai Lu
2012-11-12 21:18               ` [PATCH 41/46] x86, mm: Use clamp_t() in init_range_memory_mapping Yinghai Lu
2012-11-12 21:18               ` [PATCH 42/46] x86, mm: kill numa_free_all_bootmem() Yinghai Lu
2012-11-12 21:18               ` [PATCH 43/46] x86, mm: kill numa_64.h Yinghai Lu
2012-11-12 21:18               ` [PATCH 44/46] sparc, mm: Remove calling of free_all_bootmem_node() Yinghai Lu
2012-11-12 21:18                 ` Yinghai Lu
2012-11-12 21:18               ` [PATCH 45/46] mm: Kill NO_BOOTMEM version free_all_bootmem_node() Yinghai Lu
2012-11-12 21:18               ` [PATCH 46/46] x86, mm: Let "memmap=" take more entries one time Yinghai Lu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1349827115-16600-4-git-send-email-yinghai@kernel.org \
    --to=yinghai@kernel.org \
    --cc=hpa@zytor.com \
    --cc=jacob.shin@amd.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=stefano.stabellini@eu.citrix.com \
    --cc=tglx@linutronix.de \
    --cc=tj@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.