diff options
Diffstat (limited to 'arch/x86/xen')
-rw-r--r-- | arch/x86/xen/p2m.c | 10 |
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 */ |
653 | int m2p_add_override(unsigned long mfn, struct page *page) | 653 | int 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 | ||
688 | int m2p_remove_override(struct page *page) | 686 | int 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 |