diff options
author | Mark McLoughlin <markmc@redhat.com> | 2008-04-02 10:36:37 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-04-04 12:36:48 -0400 |
commit | a684d69d15a8fafede7c5c0daac8c646bbee805c (patch) | |
tree | 510b8f9ba8bd0d5cb23703070b342b4c05380ee3 | |
parent | f64337062c09c2c318fbcbf44ed1d739e8bc72ab (diff) |
xen: Do not pin/unpin PMD pages
i.e. with this simple test case:
int fd = open("/dev/zero", O_RDONLY);
munmap(mmap((void *)0x40000000, 0x1000_LEN, PROT_READ, MAP_PRIVATE, fd, 0), 0x1000);
close(fd);
we currently get:
kernel BUG at arch/x86/xen/enlighten.c:678!
...
EIP is at xen_release_pt+0x79/0xa9
...
Call Trace:
[<c041da25>] ? __pmd_free_tlb+0x1a/0x75
[<c047a192>] ? free_pgd_range+0x1d2/0x2b5
[<c047a2f3>] ? free_pgtables+0x7e/0x93
[<c047b272>] ? unmap_region+0xb9/0xf5
[<c047c1bd>] ? do_munmap+0x193/0x1f5
[<c047c24f>] ? sys_munmap+0x30/0x3f
[<c0408cce>] ? syscall_call+0x7/0xb
=======================
and xen complains:
(XEN) mm.c:2241:d4 Mfn 1cc37 not pinned
Further details at:
https://bugzilla.redhat.com/436453
Signed-off-by: Mark McLoughlin <markmc@redhat.com>
Cc: xen-devel@lists.xensource.com
Cc: Mark McLoughlin <markmc@redhat.com>
Cc: Jeremy Fitzhardinge <jeremy@goop.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r-- | arch/x86/xen/enlighten.c | 5 |
1 files changed, 2 insertions, 3 deletions
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index 16e2f8096a1a..f16b056e5c56 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c | |||
@@ -689,8 +689,6 @@ static void xen_alloc_ptpage(struct mm_struct *mm, u32 pfn, unsigned level) | |||
689 | make_lowmem_page_readonly(__va(PFN_PHYS(pfn))); | 689 | make_lowmem_page_readonly(__va(PFN_PHYS(pfn))); |
690 | if (level == PT_PTE) | 690 | if (level == PT_PTE) |
691 | pin_pagetable_pfn(MMUEXT_PIN_L1_TABLE, pfn); | 691 | pin_pagetable_pfn(MMUEXT_PIN_L1_TABLE, pfn); |
692 | else if (level == PT_PMD) | ||
693 | pin_pagetable_pfn(MMUEXT_PIN_L2_TABLE, pfn); | ||
694 | } else | 692 | } else |
695 | /* make sure there are no stray mappings of | 693 | /* make sure there are no stray mappings of |
696 | this page */ | 694 | this page */ |
@@ -715,7 +713,8 @@ static void xen_release_ptpage(u32 pfn, unsigned level) | |||
715 | 713 | ||
716 | if (PagePinned(page)) { | 714 | if (PagePinned(page)) { |
717 | if (!PageHighMem(page)) { | 715 | if (!PageHighMem(page)) { |
718 | pin_pagetable_pfn(MMUEXT_UNPIN_TABLE, pfn); | 716 | if (level == PT_PTE) |
717 | pin_pagetable_pfn(MMUEXT_UNPIN_TABLE, pfn); | ||
719 | make_lowmem_page_readwrite(__va(PFN_PHYS(pfn))); | 718 | make_lowmem_page_readwrite(__va(PFN_PHYS(pfn))); |
720 | } | 719 | } |
721 | } | 720 | } |