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>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
linux-kernel@vger.kernel.org, Yinghai Lu <yinghai@kernel.org>
Subject: [PATCH v9 08/46] x86, mm: Separate out calculate_table_space_size()
Date: Wed, 28 Nov 2012 13:47:19 -0800 [thread overview]
Message-ID: <1354139277-17376-9-git-send-email-yinghai@kernel.org> (raw)
In-Reply-To: <1354139277-17376-1-git-send-email-yinghai@kernel.org>
It should take physical address range that will need to be mapped.
find_early_table_space should take range that pgt buff should be in.
Separate out page table size calculation to reduce confusing.
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Reviewed-by: Pekka Enberg <penberg@kernel.org>
Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
---
arch/x86/mm/init.c | 38 +++++++++++++++++++++++++++-----------
1 files changed, 27 insertions(+), 11 deletions(-)
diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c
index c618e4f..d4e777d 100644
--- a/arch/x86/mm/init.c
+++ b/arch/x86/mm/init.c
@@ -196,12 +196,10 @@ static int __meminit split_mem_range(struct map_range *mr, int nr_range,
* mr[0].start to mr[nr_range - 1].end, while accounting for possible 2M and 1GB
* pages. Then find enough contiguous space for those page tables.
*/
-static void __init find_early_table_space(unsigned long start, unsigned long end)
+static unsigned long __init calculate_table_space_size(unsigned long start, unsigned long end)
{
int i;
unsigned long puds = 0, pmds = 0, ptes = 0, tables;
- unsigned long good_end;
- phys_addr_t base;
struct map_range mr[NR_RANGE_MR];
int nr_range;
@@ -240,9 +238,17 @@ static void __init find_early_table_space(unsigned long start, unsigned long end
#ifdef CONFIG_X86_32
/* for fixmap */
tables += roundup(__end_of_fixed_addresses * sizeof(pte_t), PAGE_SIZE);
- good_end = max_pfn_mapped << PAGE_SHIFT;
#endif
+ return tables;
+}
+
+static void __init find_early_table_space(unsigned long start,
+ unsigned long good_end,
+ unsigned long tables)
+{
+ phys_addr_t base;
+
base = memblock_find_in_range(start, good_end, tables, PAGE_SIZE);
if (!base)
panic("Cannot find space for the kernel page tables");
@@ -250,10 +256,6 @@ static void __init find_early_table_space(unsigned long start, unsigned long end
pgt_buf_start = base >> PAGE_SHIFT;
pgt_buf_end = pgt_buf_start;
pgt_buf_top = pgt_buf_start + (tables >> PAGE_SHIFT);
-
- printk(KERN_DEBUG "kernel direct mapping tables up to %#lx @ [mem %#010lx-%#010lx]\n",
- mr[nr_range - 1].end - 1, pgt_buf_start << PAGE_SHIFT,
- (pgt_buf_top << PAGE_SHIFT) - 1);
}
/*
@@ -291,6 +293,8 @@ unsigned long __init_refok init_memory_mapping(unsigned long start,
void __init init_mem_mapping(void)
{
+ unsigned long tables, good_end, end;
+
probe_page_size_mask();
/*
@@ -301,10 +305,18 @@ void __init init_mem_mapping(void)
* nodes are discovered.
*/
#ifdef CONFIG_X86_64
- find_early_table_space(0, max_pfn<<PAGE_SHIFT);
+ end = max_pfn << PAGE_SHIFT;
+ good_end = end;
#else
- find_early_table_space(0, max_low_pfn<<PAGE_SHIFT);
+ end = max_low_pfn << PAGE_SHIFT;
+ good_end = max_pfn_mapped << PAGE_SHIFT;
#endif
+ tables = calculate_table_space_size(0, end);
+ find_early_table_space(0, good_end, tables);
+ printk(KERN_DEBUG "kernel direct mapping tables up to %#lx @ [mem %#010lx-%#010lx] prealloc\n",
+ end - 1, pgt_buf_start << PAGE_SHIFT,
+ (pgt_buf_top << PAGE_SHIFT) - 1);
+
max_low_pfn_mapped = init_memory_mapping(0, max_low_pfn<<PAGE_SHIFT);
max_pfn_mapped = max_low_pfn_mapped;
@@ -331,9 +343,13 @@ void __init init_mem_mapping(void)
* RO all the pagetable pages, including the ones that are beyond
* pgt_buf_end at that time.
*/
- if (pgt_buf_end > pgt_buf_start)
+ if (pgt_buf_end > pgt_buf_start) {
+ printk(KERN_DEBUG "kernel direct mapping tables up to %#lx @ [mem %#010lx-%#010lx] final\n",
+ end - 1, pgt_buf_start << PAGE_SHIFT,
+ (pgt_buf_end << PAGE_SHIFT) - 1);
x86_init.mapping.pagetable_reserve(PFN_PHYS(pgt_buf_start),
PFN_PHYS(pgt_buf_end));
+ }
/* stop early pgtable allocating after we conclude it */
pgt_buf_top = 0;
--
1.7.7
next prev parent reply other threads:[~2012-11-28 21:56 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-11-28 21:47 [PATCH v9 00/46] x86, mm: map ram from top-down with BRK and memblock Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 01/46] x86, mm: Add global page_size_mask and probe one time only Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 02/46] x86, mm: Split out split_mem_range from init_memory_mapping Yinghai Lu
2012-11-29 10:40 ` Yasuaki Ishimatsu
2012-11-28 21:47 ` [PATCH v9 03/46] x86, mm: Move down find_early_table_space() Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 04/46] x86, mm: Move init_memory_mapping calling out of setup.c Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 05/46] x86, mm: Revert back good_end setting for 64bit Yinghai Lu
2012-12-21 8:22 ` Dave Young
2012-12-21 16:16 ` Yinghai Lu
2012-12-21 16:47 ` H. Peter Anvin
2012-11-28 21:47 ` [PATCH v9 06/46] x86, mm: Change find_early_table_space() paramters Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 07/46] x86, mm: Find early page table buffer together Yinghai Lu
2012-11-28 21:47 ` Yinghai Lu [this message]
2012-11-28 21:47 ` [PATCH v9 09/46] x86, mm: Set memblock initial limit to 1M Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 10/46] x86, mm: if kernel .text .data .bss are not marked as E820_RAM, complain and fix Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 11/46] x86, mm: Fixup code testing if a pfn is direct mapped Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 12/46] x86, mm: use pfn_range_is_mapped() with CPA Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 13/46] x86, mm: use pfn_range_is_mapped() with gart Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 14/46] x86, mm: use pfn_range_is_mapped() with reserve_initrd Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 15/46] x86, mm: Only direct map addresses that are marked as E820_RAM Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 16/46] x86, mm: relocate initrd under all mem for 64bit Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 17/46] x86, mm: Align start address to correct big page size Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 18/46] x86, mm: Use big page size for small memory range Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 19/46] x86, mm: Don't clear page table if range is ram Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 20/46] x86, mm: Break down init_all_memory_mapping Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 21/46] x86, mm: setup page table in top-down Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 22/46] x86, mm: Remove early_memremap workaround for page table accessing on 64bit Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 23/46] x86, mm: Remove parameter in alloc_low_page for 64bit Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 24/46] x86, mm: Merge alloc_low_page between 64bit and 32bit Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 25/46] x86, mm: Move min_pfn_mapped back to mm/init.c Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 26/46] x86, mm, Xen: Remove mapping_pagetable_reserve() Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 27/46] x86, mm: Add alloc_low_pages(num) Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 28/46] x86, mm: Add pointer about Xen mmu requirement for alloc_low_pages Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 29/46] x86, mm: only call early_ioremap_page_table_range_init() once Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 30/46] x86, mm: Move back pgt_buf_* to mm/init.c Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 31/46] x86, mm: Move init_gbpages() out of setup.c Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 32/46] x86, mm: change low/hignmem_pfn_init to static on 32bit Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 33/46] x86, mm: Move function declaration into mm_internal.h Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 34/46] x86, mm: Add check before clear pte above max_low_pfn on 32bit Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 35/46] x86, mm: use round_up/down in split_mem_range() Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 36/46] x86, mm: use PFN_DOWN " Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 37/46] x86, mm: use pfn instead of pos in split_mem_range Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 38/46] x86, mm: use limit_pfn for end pfn Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 39/46] x86, mm: Unifying after_bootmem for 32bit and 64bit Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 40/46] x86, mm: Move after_bootmem to mm_internel.h Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 41/46] x86, mm: Use clamp_t() in init_range_memory_mapping Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 42/46] x86, mm: kill numa_free_all_bootmem() Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 43/46] x86, mm: kill numa_64.h Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 44/46] sparc, mm: Remove calling of free_all_bootmem_node() Yinghai Lu
2012-11-28 21:47 ` Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 45/46] mm: Kill NO_BOOTMEM version free_all_bootmem_node() Yinghai Lu
2012-11-28 21:47 ` [PATCH v9 46/46] x86, mm: Let "memmap=" take more entries one time Yinghai Lu
2012-11-28 21:54 ` [PATCH v9 00/46] x86, mm: map ram from top-down with BRK and memblock H. Peter Anvin
2012-11-28 23:49 ` 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=1354139277-17376-9-git-send-email-yinghai@kernel.org \
--to=yinghai@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=hpa@zytor.com \
--cc=jacob.shin@amd.com \
--cc=konrad.wilk@oracle.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=stefano.stabellini@eu.citrix.com \
--cc=tglx@linutronix.de \
/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.