linux/i386: enhance dump_fault_path() in the highpte case
authorkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Wed, 17 Jan 2007 14:45:00 +0000 (14:45 +0000)
committerkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Wed, 17 Jan 2007 14:45:00 +0000 (14:45 +0000)
As long as the pte page isn't really located in highmem, there is no
reason to not access it, in order to print the complete page table
hierarchy. A functionally similar patch will go to lkml for native
Linux.

Signed-off-by: Jan Beulich <jbeulich@novell.com>
linux-2.6-xen-sparse/arch/i386/mm/fault-xen.c

index cd40fabc0858b3758c82fbf20b9a4cf2081b4e5d..7e52b47b04fc14cda1fcf00b580fe3d156368c59 100644 (file)
@@ -232,9 +232,12 @@ static void dump_fault_path(unsigned long address)
                p += (address >> 21) * 2;
                printk(KERN_ALERT "%08lx -> *pme = %08lx:%08lx\n", 
                       page, p[1], p[0]);
-#ifndef CONFIG_HIGHPTE
+               mfn  = (p[0] >> PAGE_SHIFT) | (p[1] << 20);
+#ifdef CONFIG_HIGHPTE
+               if (mfn_to_pfn(mfn) >= highstart_pfn)
+                       return;
+#endif
                if (p[0] & 1) {
-                       mfn  = (p[0] >> PAGE_SHIFT) | (p[1] << 20);
                        page = mfn_to_pfn(mfn) << PAGE_SHIFT; 
                        p  = (unsigned long *) __va(page);
                        address &= 0x001fffff;
@@ -242,7 +245,6 @@ static void dump_fault_path(unsigned long address)
                        printk(KERN_ALERT "%08lx -> *pte = %08lx:%08lx\n",
                               page, p[1], p[0]);
                }
-#endif
        }
 }
 #else
@@ -254,13 +256,16 @@ static void dump_fault_path(unsigned long address)
        page = ((unsigned long *) __va(page))[address >> 22];
        printk(KERN_ALERT "*pde = ma %08lx pa %08lx\n", page,
               machine_to_phys(page));
+#ifdef CONFIG_HIGHPTE
        /*
         * We must not directly access the pte in the highpte
-        * case, the page table might be allocated in highmem.
+        * case if the page table is located in highmem.
         * And lets rather not kmap-atomic the pte, just in case
         * it's allocated already.
         */
-#ifndef CONFIG_HIGHPTE
+       if ((page >> PAGE_SHIFT) >= highstart_pfn)
+               return;
+#endif
        if (page & 1) {
                page &= PAGE_MASK;
                address &= 0x003ff000;
@@ -269,7 +274,6 @@ static void dump_fault_path(unsigned long address)
                printk(KERN_ALERT "*pte = ma %08lx pa %08lx\n", page,
                       machine_to_phys(page));
        }
-#endif
 }
 #endif