diff options
author | Daniel De Graaf <dgdegra@tycho.nsa.gov> | 2011-03-24 08:10:07 -0400 |
---|---|---|
committer | Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | 2011-03-24 10:36:01 -0400 |
commit | b254244d2682fe975630f176c25a4444cc4e088d (patch) | |
tree | ac754c3e5d730cb26ce1f1e8023d8d77b9d55f98 /arch/x86/xen/p2m.c | |
parent | a93e20a83077f57638f8574b1c072ce6712e95ec (diff) | |
download | linux-3.10-b254244d2682fe975630f176c25a4444cc4e088d.tar.gz linux-3.10-b254244d2682fe975630f176c25a4444cc4e088d.tar.bz2 linux-3.10-b254244d2682fe975630f176c25a4444cc4e088d.zip |
xen/p2m: Allocate p2m tracking pages on override
It is possible to add a p2m override on pages that are currently mapped
to INVALID_P2M_ENTRY; in particular, this will happen when using
ballooned pages in gntdev. This means that set_phys_to_machine must be
used instead of __set_phys_to_machine.
Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Diffstat (limited to 'arch/x86/xen/p2m.c')
-rw-r--r-- | arch/x86/xen/p2m.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/arch/x86/xen/p2m.c b/arch/x86/xen/p2m.c index 215a3ce6106..2a44edd606e 100644 --- a/arch/x86/xen/p2m.c +++ b/arch/x86/xen/p2m.c @@ -671,7 +671,9 @@ int m2p_add_override(unsigned long mfn, struct page *page) page->private = mfn; page->index = pfn_to_mfn(pfn); - __set_phys_to_machine(pfn, FOREIGN_FRAME(mfn)); + if (unlikely(!set_phys_to_machine(pfn, FOREIGN_FRAME(mfn)))) + return -ENOMEM; + if (!PageHighMem(page)) /* Just zap old mapping for now */ pte_clear(&init_mm, address, ptep); @@ -709,7 +711,7 @@ int m2p_remove_override(struct page *page) spin_lock_irqsave(&m2p_override_lock, flags); list_del(&page->lru); spin_unlock_irqrestore(&m2p_override_lock, flags); - __set_phys_to_machine(pfn, page->index); + set_phys_to_machine(pfn, page->index); if (!PageHighMem(page)) set_pte_at(&init_mm, address, ptep, |