linux-mm.kvack.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

--
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: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[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