aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>2012-08-17 09:35:31 -0400
committerKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>2012-08-23 11:52:17 -0400
commit328731876451a837f56e66ffa11de053ed5daf73 (patch)
tree83a64eb62544e21474a18baf5f3d056d51b48a29 /arch
parent3fc509fc0c590900568ef516a37101d88f3476f5 (diff)
xen/mmu: If the revector fails, don't attempt to revector anything else.
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>
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/xen/mmu.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c
index 5b2cb54425ce..cb9db72b33f8 100644
--- a/arch/x86/xen/mmu.c
+++ b/arch/x86/xen/mmu.c
@@ -1238,7 +1238,8 @@ static void __init xen_pagetable_setup_done(pgd_t *base)
1238 memblock_free(__pa(xen_start_info->mfn_list), size); 1238 memblock_free(__pa(xen_start_info->mfn_list), size);
1239 /* And revector! Bye bye old array */ 1239 /* And revector! Bye bye old array */
1240 xen_start_info->mfn_list = new_mfn_list; 1240 xen_start_info->mfn_list = new_mfn_list;
1241 } 1241 } else
1242 goto skip;
1242 } 1243 }
1243 /* At this stage, cleanup_highmap has already cleaned __ka space 1244 /* At this stage, cleanup_highmap has already cleaned __ka space
1244 * from _brk_limit way up to the max_pfn_mapped (which is the end of 1245 * 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)
1259 * anything at this stage. */ 1260 * anything at this stage. */
1260 xen_cleanhighmap(MODULES_VADDR, roundup(MODULES_VADDR, PUD_SIZE) - 1); 1261 xen_cleanhighmap(MODULES_VADDR, roundup(MODULES_VADDR, PUD_SIZE) - 1);
1261#endif 1262#endif
1263skip:
1262#endif 1264#endif
1263 xen_post_allocator_init(); 1265 xen_post_allocator_init();
1264} 1266}