Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1489080

[PATCH v3] mm/hugetlb: fix memory offline with hugepage size > memory block size

From Gerald Schaefer <gerald.schaefer@de.ibm.com>
Newsgroups linux.kernel
Subject [PATCH v3] mm/hugetlb: fix memory offline with hugepage size > memory block size
Date 2016-09-22 18:40 +0200
Message-ID <skfct-hW-11@gated-at.bofh.it> (permalink)
References (1 earlier) <sjvCG-4Ws-31@gated-at.bofh.it> <sjJmh-5vr-5@gated-at.bofh.it> <sjOYF-yH-15@gated-at.bofh.it> <sk8Xo-4DU-13@gated-at.bofh.it> <skcxY-71r-19@gated-at.bofh.it>
Organization IBM Deutschland Research & Development GmbH / Vorsitzende des Aufsichtsrats: Martina Koederitz / Geschaeftsfuehrung: Dirk Wittkopp / Sitz der Gesellschaft: Boeblingen / Registergericht: Amtsgericht Stuttgart, HRB 243294

Show all headers | View raw


dissolve_free_huge_pages() will either run into the VM_BUG_ON() or a
list corruption and addressing exception when trying to set a memory
block offline that is part (but not the first part) of a "gigantic"
hugetlb page with a size > memory block size.

When no other smaller hugetlb page sizes are present, the VM_BUG_ON()
will trigger directly. In the other case we will run into an addressing
exception later, because dissolve_free_huge_page() will not work on the
head page of the compound hugetlb page which will result in a NULL
hstate from page_hstate().

To fix this, first remove the VM_BUG_ON() because it is wrong, and then
use the compound head page in dissolve_free_huge_page(). This means that
an unused pre-allocated gigantic page that has any part of itself inside
the memory block that is going offline will be dissolved completely.
Losing the gigantic hugepage is preferable to failing the memory offline,
for example in the situation where a (possibly faulty) memory DIMM needs
to go offline.

Also move the PageHuge() and page_count() checks out of
dissolve_free_huge_page() in order to only take the spin_lock when
actually removing a hugepage.

Fixes: c8721bbb ("mm: memory-hotplug: enable memory hotplug to handle hugepage")
Cc: <stable@vger.kernel.org>
Signed-off-by: Gerald Schaefer <gerald.schaefer@de.ibm.com>
---
Changes in v3:
- Add Fixes: c8721bbb
- Add Cc: stable
- Elaborate on losing the gigantic page vs. failing memory offline
- Move page_count() check out of dissolve_free_huge_page()

Changes in v2:
- Update comment in dissolve_free_huge_pages()
- Change locking in dissolve_free_huge_page()

 mm/hugetlb.c | 34 +++++++++++++++++++---------------
 1 file changed, 19 insertions(+), 15 deletions(-)

diff --git a/mm/hugetlb.c b/mm/hugetlb.c
index 87e11d8..29e10a2 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
@@ -1436,39 +1436,43 @@ static int free_pool_huge_page(struct hstate *h, nodemask_t *nodes_allowed,
 }
 
 /*
- * Dissolve a given free hugepage into free buddy pages. This function does
- * nothing for in-use (including surplus) hugepages.
+ * Dissolve a given free hugepage into free buddy pages.
  */
 static void dissolve_free_huge_page(struct page *page)
 {
+	struct page *head = compound_head(page);
+	struct hstate *h = page_hstate(head);
+	int nid = page_to_nid(head);
+
 	spin_lock(&hugetlb_lock);
-	if (PageHuge(page) && !page_count(page)) {
-		struct hstate *h = page_hstate(page);
-		int nid = page_to_nid(page);
-		list_del(&page->lru);
-		h->free_huge_pages--;
-		h->free_huge_pages_node[nid]--;
-		h->max_huge_pages--;
-		update_and_free_page(h, page);
-	}
+	list_del(&head->lru);
+	h->free_huge_pages--;
+	h->free_huge_pages_node[nid]--;
+	h->max_huge_pages--;
+	update_and_free_page(h, head);
 	spin_unlock(&hugetlb_lock);
 }
 
 /*
  * Dissolve free hugepages in a given pfn range. Used by memory hotplug to
  * make specified memory blocks removable from the system.
- * Note that start_pfn should aligned with (minimum) hugepage size.
+ * Note that this will dissolve a free gigantic hugepage completely, if any
+ * part of it lies within the given range.
+ * This function does nothing for in-use (including surplus) hugepages.
  */
 void dissolve_free_huge_pages(unsigned long start_pfn, unsigned long end_pfn)
 {
 	unsigned long pfn;
+	struct page *page;
 
 	if (!hugepages_supported())
 		return;
 
-	VM_BUG_ON(!IS_ALIGNED(start_pfn, 1 << minimum_order));
-	for (pfn = start_pfn; pfn < end_pfn; pfn += 1 << minimum_order)
-		dissolve_free_huge_page(pfn_to_page(pfn));
+	for (pfn = start_pfn; pfn < end_pfn; pfn += 1 << minimum_order) {
+		page = pfn_to_page(pfn);
+		if (PageHuge(page) && !page_count(page))
+			dissolve_free_huge_page(page);
+	}
 }
 
 /*

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[PATCH 0/1] memory offline issues with hugepage size > memory block size Gerald Schaefer <gerald.schaefer@de.ibm.com> - 2016-09-20 18:00 +0200
  [PATCH 1/1] mm/hugetlb: fix memory offline with hugepage size > memory block size Gerald Schaefer <gerald.schaefer@de.ibm.com> - 2016-09-20 18:00 +0200
    Re: [PATCH 1/1] mm/hugetlb: fix memory offline with hugepage size > memory block size "Hillf Danton" <hillf.zj@alibaba-inc.com> - 2016-09-21 08:40 +0200
      [PATCH v2 1/1] mm/hugetlb: fix memory offline with hugepage size >  memory block size Gerald Schaefer <gerald.schaefer@de.ibm.com> - 2016-09-21 14:40 +0200
        Re: [PATCH v2 1/1] mm/hugetlb: fix memory offline with hugepage size  > memory block size Rui Teng <rui.teng@linux.vnet.ibm.com> - 2016-09-21 15:20 +0200
          Re: [PATCH v2 1/1] mm/hugetlb: fix memory offline with hugepage  size > memory block size Gerald Schaefer <gerald.schaefer@de.ibm.com> - 2016-09-21 17:20 +0200
        Re: [PATCH v2 1/1] mm/hugetlb: fix memory offline with hugepage size > memory block size "Hillf Danton" <hillf.zj@alibaba-inc.com> - 2016-09-22 10:10 +0200
        Re: [PATCH v2 1/1] mm/hugetlb: fix memory offline with hugepage size  > memory block size Michal Hocko <mhocko@kernel.org> - 2016-09-22 12:00 +0200
          Re: [PATCH v2 1/1] mm/hugetlb: fix memory offline with hugepage  size > memory block size Gerald Schaefer <gerald.schaefer@de.ibm.com> - 2016-09-22 15:50 +0200
            [PATCH v3] mm/hugetlb: fix memory offline with hugepage size >  memory block size Gerald Schaefer <gerald.schaefer@de.ibm.com> - 2016-09-22 18:40 +0200
              Re: [PATCH v3] mm/hugetlb: fix memory offline with hugepage size >  memory block size Dave Hansen <dave.hansen@linux.intel.com> - 2016-09-22 20:20 +0200
                Re: [PATCH v3] mm/hugetlb: fix memory offline with hugepage size >  memory block size Mike Kravetz <mike.kravetz@oracle.com> - 2016-09-22 21:20 +0200
                Re: [PATCH v3] mm/hugetlb: fix memory offline with hugepage size >  memory block size Gerald Schaefer <gerald.schaefer@de.ibm.com> - 2016-09-23 12:40 +0200
          Re: [PATCH v2 1/1] mm/hugetlb: fix memory offline with hugepage size  > memory block size Rui Teng <rui.teng@linux.vnet.ibm.com> - 2016-09-23 08:50 +0200
            Re: [PATCH v2 1/1] mm/hugetlb: fix memory offline with hugepage  size > memory block size Gerald Schaefer <gerald.schaefer@de.ibm.com> - 2016-09-23 13:10 +0200
  Re: [PATCH 0/1] memory offline issues with hugepage size > memory  block size Mike Kravetz <mike.kravetz@oracle.com> - 2016-09-20 19:40 +0200
    Re: [PATCH 0/1] memory offline issues with hugepage size > memory  block size Dave Hansen <dave.hansen@linux.intel.com> - 2016-09-20 19:50 +0200
      Re: [PATCH 0/1] memory offline issues with hugepage size > memory  block size Vlastimil Babka <vbabka@suse.cz> - 2016-09-21 11:50 +0200
      Re: [PATCH 0/1] memory offline issues with hugepage size > memory  block size Gerald Schaefer <gerald.schaefer@de.ibm.com> - 2016-09-21 12:40 +0200
    Re: [PATCH 0/1] memory offline issues with hugepage size > memory  block size Gerald Schaefer <gerald.schaefer@de.ibm.com> - 2016-09-21 12:40 +0200
    Re: [PATCH 0/1] memory offline issues with hugepage size > memory  block size Michal Hocko <mhocko@kernel.org> - 2016-09-21 20:30 +0200
      Re: [PATCH 0/1] memory offline issues with hugepage size > memory  block size Dave Hansen <dave.hansen@linux.intel.com> - 2016-09-21 20:30 +0200
        Re: [PATCH 0/1] memory offline issues with hugepage size > memory  block size Michal Hocko <mhocko@kernel.org> - 2016-09-21 21:30 +0200

csiph-web