From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from psmtp.com (na3sys010amx138.postini.com [74.125.245.138]) by kanga.kvack.org (Postfix) with SMTP id CAD7F6B005D for ; Fri, 23 Dec 2011 08:00:43 -0500 (EST) Received: by wgbdt12 with SMTP id dt12so12446308wgb.2 for ; Fri, 23 Dec 2011 05:00:42 -0800 (PST) MIME-Version: 1.0 In-Reply-To: <20111222163604.GB14983@tiehlicka.suse.cz> References: <20111222163604.GB14983@tiehlicka.suse.cz> Date: Fri, 23 Dec 2011 21:00:41 +0800 Message-ID: Subject: Re: [PATCH] mm: hugetlb: undo change to page mapcount in fault handler From: Hillf Danton Content-Type: text/plain; charset=UTF-8 Sender: owner-linux-mm@kvack.org List-ID: To: Michal Hocko Cc: linux-mm@kvack.org, LKML , Andrew Morton , KAMEZAWA Hiroyuki On Fri, Dec 23, 2011 at 12:36 AM, Michal Hocko wrote: > > The changelog is rather cryptic. What about something like: > It is included in the following version, thanks. ===CUT HERE=== From: Hillf Danton Subject: [PATCH] mm: hugetlb: undo change to page mapcount in fault handler Page mapcount should be updated only if we are sure that the page ends up in the page table otherwise we would leak if we couldn't COW due to reservations or if idx is out of bounds. Signed-off-by: Hillf Danton Cc: KAMEZAWA Hiroyuki Cc: Andrew Morton Reviewed-by: Michal Hocko --- --- a/mm/hugetlb.c Tue Dec 20 21:26:30 2011 +++ b/mm/hugetlb.c Thu Dec 22 21:29:42 2011 @@ -2509,6 +2509,7 @@ static int hugetlb_no_page(struct mm_str { struct hstate *h = hstate_vma(vma); int ret = VM_FAULT_SIGBUS; + int anon_rmap = 0; pgoff_t idx; unsigned long size; struct page *page; @@ -2563,14 +2564,13 @@ retry: spin_lock(&inode->i_lock); inode->i_blocks += blocks_per_huge_page(h); spin_unlock(&inode->i_lock); - page_dup_rmap(page); } else { lock_page(page); if (unlikely(anon_vma_prepare(vma))) { ret = VM_FAULT_OOM; goto backout_unlocked; } - hugepage_add_new_anon_rmap(page, vma, address); + anon_rmap = 1; } } else { /* @@ -2583,7 +2583,6 @@ retry: VM_FAULT_SET_HINDEX(h - hstates); goto backout_unlocked; } - page_dup_rmap(page); } /* @@ -2607,6 +2606,10 @@ retry: if (!huge_pte_none(huge_ptep_get(ptep))) goto backout; + if (anon_rmap) + hugepage_add_new_anon_rmap(page, vma, address); + else + page_dup_rmap(page); new_pte = make_huge_pte(vma, page, ((vma->vm_flags & VM_WRITE) && (vma->vm_flags & VM_SHARED))); set_huge_pte_at(mm, address, ptep, new_pte); -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/ Don't email: email@kvack.org