diff options
author | Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | 2012-08-17 09:35:31 -0400 |
---|---|---|
committer | Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | 2012-08-23 11:52:17 -0400 |
commit | 328731876451a837f56e66ffa11de053ed5daf73 (patch) | |
tree | 83a64eb62544e21474a18baf5f3d056d51b48a29 /arch | |
parent | 3fc509fc0c590900568ef516a37101d88f3476f5 (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.c | 4 |
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 |
1263 | skip: | ||
1262 | #endif | 1264 | #endif |
1263 | xen_post_allocator_init(); | 1265 | xen_post_allocator_init(); |
1264 | } | 1266 | } |