From 06e7eb18a6be071f49382bcafa7bbdeb57d4585f Mon Sep 17 00:00:00 2001 From: Adam Litke Date: Mon, 10 Mar 2008 11:43:50 -0700 Subject: [PATCH] --- yaml --- r: 87091 b: refs/heads/master c: 2668db9111bb1a6ab5a54f41f703179f35c7d098 h: refs/heads/master i: 87089: 97e2539909d196d6865af8ce01fa7ae58a9a7897 87087: f49b2b3af915e715c9410b8aff270e37af3c4673 v: v3 --- [refs] | 2 +- trunk/mm/hugetlb.c | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index cb9eba45c8e2..be1cc9d8ba39 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 842078054da2d754c6b998b116d7c468abbfaaca +refs/heads/master: 2668db9111bb1a6ab5a54f41f703179f35c7d098 diff --git a/trunk/mm/hugetlb.c b/trunk/mm/hugetlb.c index dcacc811e70e..74c1b6b0b37b 100644 --- a/trunk/mm/hugetlb.c +++ b/trunk/mm/hugetlb.c @@ -286,6 +286,12 @@ static struct page *alloc_buddy_huge_page(struct vm_area_struct *vma, spin_lock(&hugetlb_lock); if (page) { + /* + * This page is now managed by the hugetlb allocator and has + * no users -- drop the buddy allocator's reference. + */ + put_page_testzero(page); + VM_BUG_ON(page_count(page)); nid = page_to_nid(page); set_compound_page_dtor(page, free_huge_page); /* @@ -369,13 +375,14 @@ static int gather_surplus_pages(int delta) enqueue_huge_page(page); else { /* - * Decrement the refcount and free the page using its - * destructor. This must be done with hugetlb_lock + * The page has a reference count of zero already, so + * call free_huge_page directly instead of using + * put_page. This must be done with hugetlb_lock * unlocked which is safe because free_huge_page takes * hugetlb_lock before deciding how to free the page. */ spin_unlock(&hugetlb_lock); - put_page(page); + free_huge_page(page); spin_lock(&hugetlb_lock); } }