aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/mm
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2008-02-04 10:48:05 -0500
committerIngo Molnar <mingo@elte.hu>2008-02-04 10:48:05 -0500
commit63c1dcf4bc9a26b1d8baa9a8c7cc1b2e1e694011 (patch)
treecc318108d71dc0fdf42525a8e93722de6b0b140c /arch/x86/mm
parent626c2c9d065da0cbd9997e112501487958fde690 (diff)
x86: CPA use the existing pfn in split as well
When splitting large pages, we ge the pfn from the existing entry instead of calculating it ourself. This removes the last remaining range restriction of the cpa code. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/mm')
-rw-r--r--arch/x86/mm/pageattr.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
index 6c55fbdbd7e8..a629cea5e465 100644
--- a/arch/x86/mm/pageattr.c
+++ b/arch/x86/mm/pageattr.c
@@ -221,8 +221,7 @@ static int split_large_page(pte_t *kpte, unsigned long address)
221{ 221{
222 pgprot_t ref_prot = pte_pgprot(pte_clrhuge(*kpte)); 222 pgprot_t ref_prot = pte_pgprot(pte_clrhuge(*kpte));
223 gfp_t gfp_flags = GFP_KERNEL; 223 gfp_t gfp_flags = GFP_KERNEL;
224 unsigned long flags; 224 unsigned long flags, addr, pfn;
225 unsigned long addr;
226 pte_t *pbase, *tmp; 225 pte_t *pbase, *tmp;
227 struct page *base; 226 struct page *base;
228 unsigned int i, level; 227 unsigned int i, level;
@@ -253,8 +252,12 @@ static int split_large_page(pte_t *kpte, unsigned long address)
253 paravirt_alloc_pt(&init_mm, page_to_pfn(base)); 252 paravirt_alloc_pt(&init_mm, page_to_pfn(base));
254#endif 253#endif
255 254
256 for (i = 0; i < PTRS_PER_PTE; i++, addr += PAGE_SIZE) 255 /*
257 set_pte(&pbase[i], pfn_pte(addr >> PAGE_SHIFT, ref_prot)); 256 * Get the target pfn from the original entry:
257 */
258 pfn = pte_pfn(*kpte);
259 for (i = 0; i < PTRS_PER_PTE; i++, pfn++)
260 set_pte(&pbase[i], pfn_pte(pfn, ref_prot));
258 261
259 /* 262 /*
260 * Install the new, split up pagetable. Important detail here: 263 * Install the new, split up pagetable. Important detail here: