diff options
author | David Vrabel <david.vrabel@citrix.com> | 2012-07-09 06:39:06 -0400 |
---|---|---|
committer | Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | 2012-07-19 15:51:44 -0400 |
commit | 66a27dde9ae96e35278983f2e59bea04eb714cd0 (patch) | |
tree | 17e7b1054153131a11ef9f437787424be5b901f1 /arch/x86/xen/mmu.c | |
parent | d095d43e78dd811d5c02c25e207c3364019b5a77 (diff) |
xen/mm: zero PTEs for non-present MFNs in the initial page table
When constructing the initial page tables, if the MFN for a usable PFN
is missing in the p2m then that frame is initially ballooned out. In
this case, zero the PTE (as in decrease_reservation() in
drivers/xen/balloon.c).
This is obviously safe instead of having an valid PTE with an MFN of
INVALID_P2M_ENTRY (~0).
Signed-off-by: David Vrabel <david.vrabel@citrix.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Diffstat (limited to 'arch/x86/xen/mmu.c')
-rw-r--r-- | arch/x86/xen/mmu.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index 3f1783a79a3c..27336dfcda8e 100644 --- a/arch/x86/xen/mmu.c +++ b/arch/x86/xen/mmu.c | |||
@@ -1432,6 +1432,10 @@ static pte_t __init mask_rw_pte(pte_t *ptep, pte_t pte) | |||
1432 | * Init-time set_pte while constructing initial pagetables, which | 1432 | * Init-time set_pte while constructing initial pagetables, which |
1433 | * doesn't allow RO page table pages to be remapped RW. | 1433 | * doesn't allow RO page table pages to be remapped RW. |
1434 | * | 1434 | * |
1435 | * If there is no MFN for this PFN then this page is initially | ||
1436 | * ballooned out so clear the PTE (as in decrease_reservation() in | ||
1437 | * drivers/xen/balloon.c). | ||
1438 | * | ||
1435 | * Many of these PTE updates are done on unpinned and writable pages | 1439 | * Many of these PTE updates are done on unpinned and writable pages |
1436 | * and doing a hypercall for these is unnecessary and expensive. At | 1440 | * and doing a hypercall for these is unnecessary and expensive. At |
1437 | * this point it is not possible to tell if a page is pinned or not, | 1441 | * this point it is not possible to tell if a page is pinned or not, |
@@ -1440,7 +1444,10 @@ static pte_t __init mask_rw_pte(pte_t *ptep, pte_t pte) | |||
1440 | */ | 1444 | */ |
1441 | static void __init xen_set_pte_init(pte_t *ptep, pte_t pte) | 1445 | static void __init xen_set_pte_init(pte_t *ptep, pte_t pte) |
1442 | { | 1446 | { |
1443 | pte = mask_rw_pte(ptep, pte); | 1447 | if (pte_mfn(pte) != INVALID_P2M_ENTRY) |
1448 | pte = mask_rw_pte(ptep, pte); | ||
1449 | else | ||
1450 | pte = __pte_ma(0); | ||
1444 | 1451 | ||
1445 | native_set_pte(ptep, pte); | 1452 | native_set_pte(ptep, pte); |
1446 | } | 1453 | } |