[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] Re: [Xen-devel] x86-64's paging_init()



>>> Keir Fraser <Keir.Fraser@xxxxxxxxxxxx> 01.09.06 17:58 >>>
>On 1/9/06 4:49 pm, "Keir Fraser" <Keir.Fraser@xxxxxxxxxxxx> wrote:
>
>>>> Correct. I suggest either a clean BUG_ON() in virt_to_xen_l2e(), or
>>>> allocate-and-map the new l2 in that same function (but raises question of
>>>> how to test the new code path).
>>> 
>>> Why in virt_to_xen_l2e()? We likely wouldn't make it there on a system
>>> this big, due to earlier memory corruption.
>> 
>> Why? The memory is only discovered and mapped after the e820 map is parsed.
>> The mapping occurs via map_pages_to_xen(). That function discovers the l2e
>> by using virt_to_xen_l2e(). So I think it ought to work.
>> 
>> You can test it out by doing a map_pages_to_xen() call on an area of virtual
>> address space that currently has no l2e. Should crash now, and work with the
>> modified virt_to_xen_l2e().
>
>Actually virt_to_xen_l2e() already allocates pagetables on demand, it turns
>out. So I think there is no issue here that needs fixing.

Here's the change I was hinting towards - replaces the BUG_ON() with proper
code.

Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>

Index: 2006-09-11/xen/arch/x86/x86_64/mm.c
===================================================================
--- 2006-09-11.orig/xen/arch/x86/x86_64/mm.c    2006-09-12 10:39:39.000000000 
+0200
+++ 2006-09-11/xen/arch/x86/x86_64/mm.c 2006-09-12 10:41:24.000000000 +0200
@@ -78,7 +78,7 @@ void __init paging_init(void)
 {
     unsigned long i, mpt_size;
     l3_pgentry_t *l3_ro_mpt;
-    l2_pgentry_t *l2_ro_mpt;
+    l2_pgentry_t *l2_ro_mpt = NULL;
     struct page_info *pg;
 
     /* Create user-accessible L2 directory to map the MPT for guests. */
@@ -87,12 +87,6 @@ void __init paging_init(void)
     idle_pg_table[l4_table_offset(RO_MPT_VIRT_START)] =
         l4e_from_page(
             virt_to_page(l3_ro_mpt), __PAGE_HYPERVISOR | _PAGE_USER);
-    l2_ro_mpt = alloc_xenheap_page();
-    clear_page(l2_ro_mpt);
-    l3_ro_mpt[l3_table_offset(RO_MPT_VIRT_START)] =
-        l3e_from_page(
-            virt_to_page(l2_ro_mpt), __PAGE_HYPERVISOR | _PAGE_USER);
-    l2_ro_mpt += l2_table_offset(RO_MPT_VIRT_START);
 
     /*
      * Allocate and map the machine-to-phys table.
@@ -110,10 +104,20 @@ void __init paging_init(void)
             PAGE_HYPERVISOR);
         memset((void *)(RDWR_MPT_VIRT_START + (i << L2_PAGETABLE_SHIFT)), 0x55,
                1UL << L2_PAGETABLE_SHIFT);
+        if ( !((unsigned long)l2_ro_mpt & ~PAGE_MASK) )
+        {
+            unsigned long va = RO_MPT_VIRT_START + (i << L2_PAGETABLE_SHIFT);
+
+            l2_ro_mpt = alloc_xenheap_page();
+            clear_page(l2_ro_mpt);
+            l3_ro_mpt[l3_table_offset(va)] =
+                l3e_from_page(
+                    virt_to_page(l2_ro_mpt), __PAGE_HYPERVISOR | _PAGE_USER);
+            l2_ro_mpt += l2_table_offset(va);
+        }
         /* NB. Cannot be GLOBAL as shadow_mode_translate reuses this area. */
         *l2_ro_mpt++ = l2e_from_page(
             pg, /*_PAGE_GLOBAL|*/_PAGE_PSE|_PAGE_USER|_PAGE_PRESENT);
-        BUG_ON(((unsigned long)l2_ro_mpt & ~PAGE_MASK) == 0);
     }
 
     /* Set up linear page table mapping. */


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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.