WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] [LINUX][X86_64] Fix initial memory mappin

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] [LINUX][X86_64] Fix initial memory mapping code.
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Fri, 02 Jun 2006 16:10:13 +0000
Delivery-date: Fri, 02 Jun 2006 09:55:57 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID 2fd7f4fb7d1453e4ff418c06961b0bd9fcb71129
# Parent  61e2ea81bd65f5df4b0e977ee9a457884b54597f
[LINUX][X86_64] Fix initial memory mapping code.

The temporary mappings needed to set up the 1:1 mappings must be torn down 
after use; otherwise they may trigger the
WARN_ON() in vmap_pte_range() (namely if the chunk allocated to hold kernel and 
initial page tables gets close to or
exceeds 128Mb, or if a sufficiently high mem= argument causes the static 
allocations to grow beyond 128Mb, which in
either case means these mappings extend into the modules area).

Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>
---
 linux-2.6-xen-sparse/arch/x86_64/mm/init-xen.c |   34 +++++++++++++++++--------
 1 files changed, 24 insertions(+), 10 deletions(-)

diff -r 61e2ea81bd65 -r 2fd7f4fb7d14 
linux-2.6-xen-sparse/arch/x86_64/mm/init-xen.c
--- a/linux-2.6-xen-sparse/arch/x86_64/mm/init-xen.c    Thu Jun 01 18:32:04 
2006 +0100
+++ b/linux-2.6-xen-sparse/arch/x86_64/mm/init-xen.c    Thu Jun 01 19:07:40 
2006 +0100
@@ -56,6 +56,8 @@ struct dma_mapping_ops* dma_ops;
 struct dma_mapping_ops* dma_ops;
 EXPORT_SYMBOL(dma_ops);
 
+int after_bootmem;
+
 extern unsigned long *contiguous_bitmap;
 
 static unsigned long dma_reserve __initdata;
@@ -74,7 +76,7 @@ extern unsigned long start_pfn;
        (((mfn_to_pfn((addr) >> PAGE_SHIFT)) << PAGE_SHIFT) +   \
        __START_KERNEL_map)))
 
-static void early_make_page_readonly(void *va, unsigned int feature)
+static void __meminit early_make_page_readonly(void *va, unsigned int feature)
 {
        unsigned long addr, _va = (unsigned long)va;
        pte_t pte, *ptep;
@@ -82,6 +84,11 @@ static void early_make_page_readonly(voi
 
        if (xen_feature(feature))
                return;
+
+       if (after_bootmem) {
+               make_page_readonly(va, feature);
+               return;
+       }
 
        addr = (unsigned long) page[pgd_index(_va)];
        addr_to_page(addr, page);
@@ -198,10 +205,6 @@ void show_mem(void)
        printk(KERN_INFO "%lu pages swap cached\n",cached);
 }
 
-/* References to section boundaries */
-
-int after_bootmem;
-
 static void *spp_getpage(void)
 { 
        void *ptr;
@@ -448,9 +451,9 @@ phys_pmd_init(pmd_t *pmd, unsigned long 
                pte = alloc_static_page(&pte_phys);
                pte_save = pte;
                for (k = 0; k < PTRS_PER_PTE; pte++, k++, address += PTE_SIZE) {
-                       if ((address >= end) ||
-                           ((address >> PAGE_SHIFT) >=
-                            xen_start_info->nr_pages)) { 
+                       if (address >= (after_bootmem
+                                       ? end
+                                       : xen_start_info->nr_pages << 
PAGE_SHIFT)) {
                                __set_pte(pte, __pte(0)); 
                                continue;
                        }
@@ -550,7 +553,7 @@ void __init xen_init_pt(void)
                mk_kernel_pgd(__pa_symbol(level3_user_pgt)));
 }
 
-void __init extend_init_mapping(unsigned long tables_space)
+static void __init extend_init_mapping(unsigned long tables_space)
 {
        unsigned long va = __START_KERNEL_map;
        unsigned long phys, addr, *pte_page;
@@ -666,7 +669,18 @@ void __meminit init_memory_mapping(unsig
                        set_pgd(pgd_offset_k(start), mk_kernel_pgd(pud_phys));
        }
 
-       BUG_ON(!after_bootmem && start_pfn != table_end);
+       if (!after_bootmem) {
+               BUG_ON(start_pfn != table_end);
+
+               /* Destroy the temporary mappings created above. */
+               start = __START_KERNEL_map + (table_start << PAGE_SHIFT);
+               end = start + tables_space;
+               for (; start < end; start += PAGE_SIZE) {
+                       /* Should also clear out and reclaim any page table
+                          pages no longer needed... */
+                       WARN_ON(HYPERVISOR_update_va_mapping(start, 
__pte_ma(0), 0));
+               }
+       }
 
        __flush_tlb_all();
 }

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] [LINUX][X86_64] Fix initial memory mapping code., Xen patchbot-unstable <=