aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>2005-06-24 09:26:29 +0000
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>2005-06-24 09:26:29 +0000
commitb8cb514f93ee4a77c86514831e84b0d0f9cc299f (patch)
tree8acb533ebb007a025bcd5559b26e7e823bb8d34e
parentc8cf49e882fd2e0aa7450e25c7b5b785dc97c725 (diff)
downloadxen-b8cb514f93ee4a77c86514831e84b0d0f9cc299f.tar.gz
xen-b8cb514f93ee4a77c86514831e84b0d0f9cc299f.tar.bz2
xen-b8cb514f93ee4a77c86514831e84b0d0f9cc299f.zip
bitkeeper revision 1.1748.1.1 (42bbd1c5CE48yPys_hWh-39fCz3QGw)
Patch below is needed to make my system work stable in PAE mode. Havn't seen problems without PAE, not sure whenever thats just pure luck or whenever there is a bug in my PAE xenlinux kernel. To me it looks like a generic bug though. I've actually trapped into problems with unpin only: A process exits, somewhere in exit_mm() the page tables are unpinned, shortly thereafter the mappings are cleared. While doing so the kernel oopses in zap_pte_range(), on page table write access. Probably due to some stale tlb entry where the page is still tagged read-only.
-rw-r--r--linux-2.6.11-xen-sparse/arch/xen/i386/mm/pgtable.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/linux-2.6.11-xen-sparse/arch/xen/i386/mm/pgtable.c b/linux-2.6.11-xen-sparse/arch/xen/i386/mm/pgtable.c
index f3756654c3..06495cd9de 100644
--- a/linux-2.6.11-xen-sparse/arch/xen/i386/mm/pgtable.c
+++ b/linux-2.6.11-xen-sparse/arch/xen/i386/mm/pgtable.c
@@ -461,7 +461,8 @@ void mm_pin(struct mm_struct *mm)
mm_walk(mm, PAGE_KERNEL_RO);
HYPERVISOR_update_va_mapping(
(unsigned long)mm->pgd,
- pfn_pte(virt_to_phys(mm->pgd)>>PAGE_SHIFT, PAGE_KERNEL_RO), 0);
+ pfn_pte(virt_to_phys(mm->pgd)>>PAGE_SHIFT, PAGE_KERNEL_RO),
+ UVMF_TLB_FLUSH);
xen_pgd_pin(__pa(mm->pgd));
mm->context.pinned = 1;
spin_lock(&mm_unpinned_lock);
@@ -480,6 +481,7 @@ void mm_unpin(struct mm_struct *mm)
(unsigned long)mm->pgd,
pfn_pte(virt_to_phys(mm->pgd)>>PAGE_SHIFT, PAGE_KERNEL), 0);
mm_walk(mm, PAGE_KERNEL);
+ xen_tlb_flush();
mm->context.pinned = 0;
spin_lock(&mm_unpinned_lock);
list_add(&mm->context.unpinned, &mm_unpinned);