[PATCH 24 of 36] x86_64: create small vmemmap mappings if PSE not available

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Jeremy Fitzhardinge
Date: Tuesday, June 24, 2008 - 9:19 pm

If PSE is not available, then fall back to 4k page mappings for the
vmemmap area.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
---
 arch/x86/mm/init_64.c |   62 +++++++++++++++++++++++++++++++------------------
 1 file changed, 40 insertions(+), 22 deletions(-)

diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
--- a/arch/x86/mm/init_64.c
+++ b/arch/x86/mm/init_64.c
@@ -997,7 +997,7 @@
 	pmd_t *pmd;
 
 	for (; addr < end; addr = next) {
-		next = pmd_addr_end(addr, end);
+		void *p = NULL;
 
 		pgd = vmemmap_pgd_populate(addr, node);
 		if (!pgd)
@@ -1007,33 +1007,51 @@
 		if (!pud)
 			return -ENOMEM;
 
-		pmd = pmd_offset(pud, addr);
-		if (pmd_none(*pmd)) {
-			pte_t entry;
-			void *p;
+		if (!cpu_has_pse) {
+			next = (addr + PAGE_SIZE) & PAGE_MASK;
+			pmd = vmemmap_pmd_populate(pud, addr, node);
 
-			p = vmemmap_alloc_block(PMD_SIZE, node);
+			if (!pmd)
+				return -ENOMEM;
+
+			p = vmemmap_pte_populate(pmd, addr, node);
+
 			if (!p)
 				return -ENOMEM;
 
-			entry = pfn_pte(__pa(p) >> PAGE_SHIFT,
-							PAGE_KERNEL_LARGE);
-			set_pmd(pmd, __pmd(pte_val(entry)));
+			addr_end = addr + PAGE_SIZE;
+			p_end = p + PAGE_SIZE;
+		} else {
+			next = pmd_addr_end(addr, end);
 
-			/* check to see if we have contiguous blocks */
-			if (p_end != p || node_start != node) {
-				if (p_start)
-					printk(KERN_DEBUG " [%lx-%lx] PMD -> [%p-%p] on node %d\n",
-						addr_start, addr_end-1, p_start, p_end-1, node_start);
-				addr_start = addr;
-				node_start = node;
-				p_start = p;
-			}
-			addr_end = addr + PMD_SIZE;
-			p_end = p + PMD_SIZE;
-		} else {
-			vmemmap_verify((pte_t *)pmd, node, addr, next);
+			pmd = pmd_offset(pud, addr);
+			if (pmd_none(*pmd)) {
+				pte_t entry;
+
+				p = vmemmap_alloc_block(PMD_SIZE, node);
+				if (!p)
+					return -ENOMEM;
+
+				entry = pfn_pte(__pa(p) >> PAGE_SHIFT,
+						PAGE_KERNEL_LARGE);
+				set_pmd(pmd, __pmd(pte_val(entry)));
+
+				addr_end = addr + PMD_SIZE;
+				p_end = p + PMD_SIZE;
+
+				/* check to see if we have contiguous blocks */
+				if (p_end != p || node_start != node) {
+					if (p_start)
+						printk(KERN_DEBUG " [%lx-%lx] PMD -> [%p-%p] on node %d\n",
+						       addr_start, addr_end-1, p_start, p_end-1, node_start);
+					addr_start = addr;
+					node_start = node;
+					p_start = p;
+				}
+			} else
+				vmemmap_verify((pte_t *)pmd, node, addr, next);
 		}
+
 	}
 	return 0;
 }


--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH 00 of 36] x86/paravirt: groundwork for 64-bit Xen s ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:18 pm)
[PATCH 01 of 36] x86: asm-x86/pgtable.h: fix compiler warning, Jeremy Fitzhardinge, (Tue Jun 24, 9:18 pm)
[PATCH 02 of 36] x86: add memory clobber to save/loadsegment, Jeremy Fitzhardinge, (Tue Jun 24, 9:18 pm)
[PATCH 03 of 36] x86: add memory barriers to wrmsr, Jeremy Fitzhardinge, (Tue Jun 24, 9:18 pm)
[PATCH 04 of 36] x86: remove open-coded save/load segment ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 05 of 36] x86_64: use write_gdt_entry in vsyscall_s ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 06 of 36] x86_64: use p??_populate() to attach page ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 07 of 36] x86_64: unify early_ioremap, Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 08 of 36] x86_64: Add gate_offset() and gate_segmen ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 09 of 36] x86_64: Use __pgd() on mk_kernel_pgd(), Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 10 of 36] x86: unify pgd_index, Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 11 of 36] x86: unify mmu_context.h, Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 12 of 36] x86_64: replace end_pfn with num_physpages, Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 13 of 36] x86_64: add prototype for x86_64_start_ke ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 14 of 36] x86_64: add sync_cmpxchg, Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 15 of 36] x86: simplify vmalloc_sync_all, Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 16 of 36] x86/paravirt: add a pgd_alloc/free hooks, Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 17 of 36] x86: preallocate and prepopulate separately, Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 18 of 36] x86/paravirt: add debugging for missing o ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 19 of 36] paravirt_ops: define PARA_INDIRECT for in ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 20 of 36] paravirt/x86_64: move __PAGE_OFFSET to le ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 21 of 36] x86-64: add FIX_PARAVIRT_BOOTMAP fixmap slot, Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 22 of 36] x86_64: split x86_64_start_kernel, Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 23 of 36] x86_64: adjust mapping of physical pageta ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 24 of 36] x86_64: create small vmemmap mappings if ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 25 of 36] x86_64: PSE no longer a hard requirement, Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 26 of 36] x86_64: Split set_pte_vaddr(), Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 27 of 36] x86_64: __switch_to(): Move arch_leave_la ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 28 of 36] Save %fs and %gs before load_TLS() and ar ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 29 of 36] Use __KERNEL_DS as SS when returning to a ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 30 of 36] x86/paravirt_ops: split sysret and sysexit, Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 31 of 36] x86_64 pvops: don't restore user rsp with ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 32 of 36] Add sysret/sysexit pvops for returning to ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 33 of 36] x86_64: ia32entry: replace privileged ins ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 34 of 36] x86_64: swapgs pvop with a user-stack can ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 35 of 36] x86_64/paravirt: add adjust_exception_frame, Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
[PATCH 36 of 36] x86_64/paravirt: Make load_gs_index() a p ..., Jeremy Fitzhardinge, (Tue Jun 24, 9:19 pm)
Re: [PATCH 03 of 36] x86: add memory barriers to wrmsr, Arjan van de Ven, (Tue Jun 24, 9:44 pm)
Re: [PATCH 00 of 36] x86/paravirt: groundwork for 64-bit X ..., Jeremy Fitzhardinge, (Wed Jun 25, 4:46 am)
Re: [PATCH 36 of 36] x86_64/paravirt: Make load_gs_index() ..., Jeremy Fitzhardinge, (Wed Jun 25, 4:48 am)
Re: [PATCH 00 of 36] x86/paravirt: groundwork for 64-bit X ..., Jeremy Fitzhardinge, (Wed Jun 25, 1:03 pm)
Re: [PATCH 00 of 36] x86/paravirt: groundwork for 64-bit X ..., Jeremy Fitzhardinge, (Wed Jun 25, 1:12 pm)
Re: [PATCH 03 of 36] x86: add memory barriers to wrmsr, Jeremy Fitzhardinge, (Wed Jun 25, 2:08 pm)
Re: [PATCH 03 of 36] x86: add memory barriers to wrmsr, Arjan van de Ven, (Wed Jun 25, 3:31 pm)
Re: [PATCH 03 of 36] x86: add memory barriers to wrmsr, Jeremy Fitzhardinge, (Wed Jun 25, 4:05 pm)
Re: [PATCH 03 of 36] x86: add memory barriers to wrmsr, H. Peter Anvin, (Wed Jun 25, 4:18 pm)
Re: [PATCH 03 of 36] x86: add memory barriers to wrmsr, Jeremy Fitzhardinge, (Wed Jun 25, 4:37 pm)
Re: [PATCH 03 of 36] x86: add memory barriers to wrmsr, H. Peter Anvin, (Wed Jun 25, 4:42 pm)
Re: [PATCH 00 of 36] x86/paravirt: groundwork for 64-bit X ..., Jeremy Fitzhardinge, (Thu Jun 26, 7:28 am)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundw ..., Jeremy Fitzhardinge, (Thu Jun 26, 7:34 am)
Re: [PATCH 00 of 36] x86/paravirt: groundwork for 64-bit X ..., Jeremy Fitzhardinge, (Thu Jun 26, 11:25 am)
Re: [PATCH 00 of 36] x86/paravirt: groundwork for 64-bit X ..., Jeremy Fitzhardinge, (Thu Jun 26, 12:02 pm)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundw ..., Jeremy Fitzhardinge, (Fri Jun 27, 9:02 am)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundw ..., Jeremy Fitzhardinge, (Fri Jun 27, 9:25 am)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundw ..., Jeremy Fitzhardinge, (Fri Jun 27, 12:04 pm)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundw ..., Jeremy Fitzhardinge, (Sun Jun 29, 8:02 pm)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundw ..., Jeremy Fitzhardinge, (Sun Jun 29, 10:32 pm)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundw ..., Jeremy Fitzhardinge, (Mon Jun 30, 10:17 am)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundw ..., Jeremy Fitzhardinge, (Mon Jun 30, 10:57 am)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundw ..., Jeremy Fitzhardinge, (Mon Jun 30, 11:36 am)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundw ..., Jeremy Fitzhardinge, (Mon Jun 30, 4:04 pm)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundw ..., Jeremy Fitzhardinge, (Tue Jul 1, 9:10 am)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundw ..., Jeremy Fitzhardinge, (Tue Jul 1, 9:14 am)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundw ..., Jeremy Fitzhardinge, (Thu Jul 3, 8:47 am)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundw ..., Jeremy Fitzhardinge, (Thu Jul 3, 11:25 am)
Re: [Xen-devel] Re: [PATCH 00 of 36] x86/paravirt: groundw ..., Jeremy Fitzhardinge, (Thu Jul 3, 11:41 am)