xen/mmu: If the revector fails, don't attempt to revector anything else.
authorKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Fri, 17 Aug 2012 13:35:31 +0000 (09:35 -0400)
committerKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Thu, 23 Aug 2012 15:52:17 +0000 (11:52 -0400)
If the P2M revectoring would fail, we would try to continue on by
cleaning the PMD for L1 (PTE) page-tables. The xen_cleanhighmap
is greedy and erases the PMD on both boundaries. Since the P2M
array can share the PMD, we would wipe out part of the __ka
that is still used in the P2M tree to point to P2M leafs.

This fixes it by bypassing the revectoring and continuing on.
If the revector fails, a nice WARN is printed so we can still
troubleshoot this.

Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
arch/x86/xen/mmu.c

index 5b2cb54..cb9db72 100644 (file)
@@ -1238,7 +1238,8 @@ static void __init xen_pagetable_setup_done(pgd_t *base)
                        memblock_free(__pa(xen_start_info->mfn_list), size);
                        /* And revector! Bye bye old array */
                        xen_start_info->mfn_list = new_mfn_list;
-               }
+               } else
+                       goto skip;
        }
        /* At this stage, cleanup_highmap has already cleaned __ka space
         * from _brk_limit way up to the max_pfn_mapped (which is the end of
@@ -1259,6 +1260,7 @@ static void __init xen_pagetable_setup_done(pgd_t *base)
         * anything at this stage. */
        xen_cleanhighmap(MODULES_VADDR, roundup(MODULES_VADDR, PUD_SIZE) - 1);
 #endif
+skip:
 #endif
        xen_post_allocator_init();
 }