mirror of https://lore.kernel.org/lkml/
 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 02/10] x86, mm: Use big page size for small memory range
Date: Mon,  8 Oct 2012 21:39:10 -0700	[thread overview]
Message-ID: <1349757558-10856-3-git-send-email-yinghai@kernel.org> (raw)
In-Reply-To: <1349757558-10856-1-git-send-email-yinghai@kernel.org>

We could map small range in the middle of big range at first, so should use
big page size at first to avoid using small page size to break down page table.

Only can set big page bit when that range has big ram area around it.

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

diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c
index cf662ba..0c58f2d 100644
--- a/arch/x86/mm/init.c
+++ b/arch/x86/mm/init.c
@@ -88,6 +88,35 @@ static int __meminit save_mr(struct map_range *mr, int nr_range,
 	return nr_range;
 }
 
+/*
+ * adjust the page_size_mask for small range to go with
+ *	big page size instead small one if nearby are ram too.
+ */
+static void __init_refok adjust_range_page_size_mask(struct map_range *mr,
+							 int nr_range)
+{
+	int i;
+
+	for (i = 0; i < nr_range; i++) {
+		if ((page_size_mask & (1<<PG_LEVEL_2M)) &&
+		    !(mr[i].page_size_mask & (1<<PG_LEVEL_2M))) {
+			unsigned long start = round_down(mr[i].start, PMD_SIZE);
+			unsigned long end = round_up(mr[i].end, PMD_SIZE);
+
+			if (memblock_is_region_memory(start, end - start))
+				mr[i].page_size_mask |= 1<<PG_LEVEL_2M;
+		}
+		if ((page_size_mask & (1<<PG_LEVEL_1G)) &&
+		    !(mr[i].page_size_mask & (1<<PG_LEVEL_1G))) {
+			unsigned long start = round_down(mr[i].start, PUD_SIZE);
+			unsigned long end = round_up(mr[i].end, PUD_SIZE);
+
+			if (memblock_is_region_memory(start, end - start))
+				mr[i].page_size_mask |= 1<<PG_LEVEL_1G;
+		}
+	}
+}
+
 static int __meminit split_mem_range(struct map_range *mr, int nr_range,
 				     unsigned long start,
 				     unsigned long end)
@@ -182,6 +211,9 @@ static int __meminit split_mem_range(struct map_range *mr, int nr_range,
 		nr_range--;
 	}
 
+	if (!after_bootmem)
+		adjust_range_page_size_mask(mr, nr_range);
+
 	for (i = 0; i < nr_range; i++)
 		printk(KERN_DEBUG " [mem %#010lx-%#010lx] page %s\n",
 				mr[i].start, mr[i].end - 1,
-- 
1.7.7


  parent reply	other threads:[~2012-10-09  4:39 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-10-09  4:39 [PATCH -v2 00/10] x86: Use BRK to pre mapping page table to make xen happy Yinghai Lu
2012-10-09  4:39 ` [PATCH 01/10] x86, mm: align start address to correct big page size Yinghai Lu
2012-10-09  4:39 ` Yinghai Lu [this message]
2012-10-09  4:39 ` [PATCH 03/10] x86, mm: get early page table from BRK Yinghai Lu
2012-10-09 16:01   ` Konrad Rzeszutek Wilk
2012-10-10  1:03     ` Yinghai Lu
2012-10-10 14:17       ` Konrad Rzeszutek Wilk
2012-10-10 15:49         ` Yinghai Lu
2012-10-11 14:41           ` Konrad Rzeszutek Wilk
2012-10-11 22:55             ` Yinghai Lu
2012-10-11 23:18               ` H. Peter Anvin
2012-10-09  4:39 ` [PATCH 04/10] x86, mm: Don't clear page table if next range is ram Yinghai Lu
2012-10-09 16:04   ` Konrad Rzeszutek Wilk
2012-10-10  1:08     ` Yinghai Lu
2012-10-09  4:39 ` [PATCH 05/10] x86, mm: Remove early_memremap workaround for page table accessing Yinghai Lu
2012-10-09  4:39 ` [PATCH 06/10] x86, mm: only keep initial mapping for ram Yinghai Lu
2012-10-09  4:39 ` [PATCH 07/10] x86, xen, mm: Do not need to check if page table is ioremap Yinghai Lu
2012-10-09 16:13   ` Konrad Rzeszutek Wilk
2012-10-09  4:39 ` [PATCH 08/10] x86, xen, mm: fix mapping_pagetable_reserve logic Yinghai Lu
2012-10-09  6:12   ` H. Peter Anvin
2012-10-09  6:33     ` Yinghai Lu
2012-10-09  7:22       ` H. Peter Anvin
2012-10-09 12:22         ` Stefano Stabellini
2012-10-09 14:15           ` H. Peter Anvin
2012-10-09  4:39 ` [PATCH 09/10] x86, mm: Hide pgt_buf_* into internal to xen Yinghai Lu
2012-10-09  4:39 ` [PATCH 10/10] x86, mm: Add early_pgt_buf_* Yinghai Lu
2012-10-09  6:07 ` [PATCH -v2 00/10] x86: Use BRK to pre mapping page table to make xen happy H. Peter Anvin
2012-10-09  6:21   ` Yinghai Lu
2012-10-09  6:25     ` H. Peter Anvin
2012-10-09  6:45       ` Yinghai Lu
2012-10-09 12:19 ` Stefano Stabellini
2012-10-09 18:27   ` Yinghai Lu
2012-10-10  0:00     ` 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=1349757558-10856-3-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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome