X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=mm%2Fhugetlb.c;h=1a5642074e342532f4a844ed0d2fdc86bd9b5de9;hb=060195500e0347a6ba8ea89739a9898961eb6f2b;hp=e0fda156f0212a1a44c0d27f13dc8ffd1cda1064;hpb=8234b65afa92215ae0ed965811ac20c8b3a1806a;p=linux-2.6 diff --git a/mm/hugetlb.c b/mm/hugetlb.c index e0fda156f0..1a5642074e 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -699,6 +699,11 @@ int copy_hugetlb_page_range(struct mm_struct *dst, struct mm_struct *src, dst_pte = huge_pte_alloc(dst, addr); if (!dst_pte) goto nomem; + + /* If the pagetables are shared don't copy or take references */ + if (dst_pte == src_pte) + continue; + spin_lock(&dst->page_table_lock); spin_lock(&src->page_table_lock); if (!pte_none(*src_pte)) { @@ -808,6 +813,7 @@ static int hugetlb_cow(struct mm_struct *mm, struct vm_area_struct *vma, spin_unlock(&mm->page_table_lock); copy_huge_page(new_page, old_page, address, vma); + __SetPageUptodate(new_page); spin_lock(&mm->page_table_lock); ptep = huge_pte_offset(mm, address & HPAGE_MASK); @@ -853,6 +859,7 @@ retry: goto out; } clear_huge_page(page, address); + __SetPageUptodate(page); if (vma->vm_flags & VM_SHARED) { int err;