aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/xen
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/xen')
-rw-r--r--arch/x86/xen/p2m.c10
1 files changed, 4 insertions, 6 deletions
diff --git a/arch/x86/xen/p2m.c b/arch/x86/xen/p2m.c
index 141eb0de8b06..2d2b32af3a1d 100644
--- a/arch/x86/xen/p2m.c
+++ b/arch/x86/xen/p2m.c
@@ -650,7 +650,7 @@ static unsigned long mfn_hash(unsigned long mfn)
650} 650}
651 651
652/* Add an MFN override for a particular page */ 652/* Add an MFN override for a particular page */
653int m2p_add_override(unsigned long mfn, struct page *page) 653int m2p_add_override(unsigned long mfn, struct page *page, bool clear_pte)
654{ 654{
655 unsigned long flags; 655 unsigned long flags;
656 unsigned long pfn; 656 unsigned long pfn;
@@ -662,7 +662,6 @@ int m2p_add_override(unsigned long mfn, struct page *page)
662 if (!PageHighMem(page)) { 662 if (!PageHighMem(page)) {
663 address = (unsigned long)__va(pfn << PAGE_SHIFT); 663 address = (unsigned long)__va(pfn << PAGE_SHIFT);
664 ptep = lookup_address(address, &level); 664 ptep = lookup_address(address, &level);
665
666 if (WARN(ptep == NULL || level != PG_LEVEL_4K, 665 if (WARN(ptep == NULL || level != PG_LEVEL_4K,
667 "m2p_add_override: pfn %lx not mapped", pfn)) 666 "m2p_add_override: pfn %lx not mapped", pfn))
668 return -EINVAL; 667 return -EINVAL;
@@ -674,10 +673,9 @@ int m2p_add_override(unsigned long mfn, struct page *page)
674 if (unlikely(!set_phys_to_machine(pfn, FOREIGN_FRAME(mfn)))) 673 if (unlikely(!set_phys_to_machine(pfn, FOREIGN_FRAME(mfn))))
675 return -ENOMEM; 674 return -ENOMEM;
676 675
677 if (!PageHighMem(page)) 676 if (clear_pte && !PageHighMem(page))
678 /* Just zap old mapping for now */ 677 /* Just zap old mapping for now */
679 pte_clear(&init_mm, address, ptep); 678 pte_clear(&init_mm, address, ptep);
680
681 spin_lock_irqsave(&m2p_override_lock, flags); 679 spin_lock_irqsave(&m2p_override_lock, flags);
682 list_add(&page->lru, &m2p_overrides[mfn_hash(mfn)]); 680 list_add(&page->lru, &m2p_overrides[mfn_hash(mfn)]);
683 spin_unlock_irqrestore(&m2p_override_lock, flags); 681 spin_unlock_irqrestore(&m2p_override_lock, flags);
@@ -685,7 +683,7 @@ int m2p_add_override(unsigned long mfn, struct page *page)
685 return 0; 683 return 0;
686} 684}
687 685
688int m2p_remove_override(struct page *page) 686int m2p_remove_override(struct page *page, bool clear_pte)
689{ 687{
690 unsigned long flags; 688 unsigned long flags;
691 unsigned long mfn; 689 unsigned long mfn;
@@ -713,7 +711,7 @@ int m2p_remove_override(struct page *page)
713 spin_unlock_irqrestore(&m2p_override_lock, flags); 711 spin_unlock_irqrestore(&m2p_override_lock, flags);
714 set_phys_to_machine(pfn, page->index); 712 set_phys_to_machine(pfn, page->index);
715 713
716 if (!PageHighMem(page)) 714 if (clear_pte && !PageHighMem(page))
717 set_pte_at(&init_mm, address, ptep, 715 set_pte_at(&init_mm, address, ptep,
718 pfn_pte(pfn, PAGE_KERNEL)); 716 pfn_pte(pfn, PAGE_KERNEL));
719 /* No tlb flush necessary because the caller already 717 /* No tlb flush necessary because the caller already