linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] hugetlb: avoid gratuitous BUG_ON in hugetlb_fault() -> hugetlb_cow()
@ 2012-04-29 19:04 Chris Metcalf
  2012-04-30 20:19 ` Hugh Dickins
  0 siblings, 1 reply; 7+ messages in thread
From: Chris Metcalf @ 2012-04-29 19:04 UTC (permalink / raw)
  To: Andrew Morton, Hillf Danton, Michal Hocko, KAMEZAWA Hiroyuki,
	Hugh Dickins, linux-mm, linux-kernel

Commit 66aebce747eaf added code to avoid a race condition by
elevating the page refcount in hugetlb_fault() while calling
hugetlb_cow().  However, one code path in hugetlb_cow() includes
an assertion that the page count is 1, whereas it may now also
have the value 2 in this path.

Signed-off-by: Chris Metcalf <cmetcalf@tilera.com>
---
We discovered this while testing the original path; one particular
application triggered this due to the specific number of huge pages
it started with.

 mm/hugetlb.c |    9 ++++++++-
 1 files changed, 8 insertions(+), 1 deletions(-)

diff --git a/mm/hugetlb.c b/mm/hugetlb.c
index cd65cb1..d5b0254 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
@@ -2498,7 +2498,14 @@ retry_avoidcopy:
 		if (outside_reserve) {
 			BUG_ON(huge_pte_none(pte));
 			if (unmap_ref_private(mm, vma, old_page, address)) {
-				BUG_ON(page_count(old_page) != 1);
+				/*
+				 * Page refcount may be 1 in the common case,
+				 * but since we may do an extra get_page()
+				 * when called from hugetlb_fault(), we allow
+				 * a page refcount of 2 as well.
+				 */
+				BUG_ON(page_count(old_page) != 1 &&
+				       page_count(old_page) != 2);
 				BUG_ON(huge_pte_none(pte));
 				spin_lock(&mm->page_table_lock);
 				ptep = huge_pte_offset(mm, address & huge_page_mask(h));
-- 
1.6.5.2


^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2012-05-01 15:43 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-04-29 19:04 [PATCH] hugetlb: avoid gratuitous BUG_ON in hugetlb_fault() -> hugetlb_cow() Chris Metcalf
2012-04-30 20:19 ` Hugh Dickins
2012-05-01 13:14   ` Mel Gorman
2012-04-29 19:04     ` Chris Metcalf
2012-05-01 13:47       ` Mel Gorman
2012-05-01 13:53       ` Hillf Danton
2012-05-01 15:43       ` Hugh Dickins

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).