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


Groups > linux.kernel > #1491458

[PATCH v4 1/3] mm/hugetlb: fix memory offline with hugepage size > memory block size

From Gerald Schaefer <gerald.schaefer@de.ibm.com>
Newsgroups linux.kernel
Subject [PATCH v4 1/3] mm/hugetlb: fix memory offline with hugepage size > memory block size
Date 2016-09-26 19:30 +0200
Message-ID <slHT3-6G2-13@gated-at.bofh.it> (permalink)
References <slHT3-6G2-1@gated-at.bofh.it>
Organization linux.* mail to news gateway

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 an unused gigantic hugepage is preferable to failing the memory
offline, for example in the situation where a (possibly faulty) memory
DIMM needs to go offline.

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>
---
 mm/hugetlb.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/mm/hugetlb.c b/mm/hugetlb.c
index 87e11d8..603bdd0 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
@@ -1443,13 +1443,14 @@ static void dissolve_free_huge_page(struct page *page)
 {
 	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);
+		struct page *head = compound_head(page);
+		struct hstate *h = page_hstate(head);
+		int nid = page_to_nid(head);
+		list_del(&head->lru);
 		h->free_huge_pages--;
 		h->free_huge_pages_node[nid]--;
 		h->max_huge_pages--;
-		update_and_free_page(h, page);
+		update_and_free_page(h, head);
 	}
 	spin_unlock(&hugetlb_lock);
 }
@@ -1457,7 +1458,8 @@ static void dissolve_free_huge_page(struct page *page)
 /*
  * 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.
  */
 void dissolve_free_huge_pages(unsigned long start_pfn, unsigned long end_pfn)
 {
@@ -1466,7 +1468,6 @@ void dissolve_free_huge_pages(unsigned long start_pfn, unsigned long end_pfn)
 	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));
 }
-- 
2.8.4

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


Thread

[PATCH v4 0/3] mm/hugetlb: memory offline issues with hugepages Gerald Schaefer <gerald.schaefer@de.ibm.com> - 2016-09-26 19:30 +0200
  [PATCH v4 2/3] mm/hugetlb: check for reserved hugepages during memory offline Gerald Schaefer <gerald.schaefer@de.ibm.com> - 2016-09-26 19:30 +0200
    Re: [PATCH v4 2/3] mm/hugetlb: check for reserved hugepages during  memory offline Michal Hocko <mhocko@kernel.org> - 2016-09-29 14:40 +0200
      Re: [PATCH v4 2/3] mm/hugetlb: check for reserved hugepages during  memory offline Mike Kravetz <mike.kravetz@oracle.com> - 2016-09-29 19:20 +0200
        Re: [PATCH v4 2/3] mm/hugetlb: check for reserved hugepages during  memory offline Michal Hocko <mhocko@kernel.org> - 2016-09-30 08:40 +0200
  [PATCH v4 3/3] mm/hugetlb: improve locking in dissolve_free_huge_pages() Gerald Schaefer <gerald.schaefer@de.ibm.com> - 2016-09-26 19:30 +0200
    Re: [PATCH v4 3/3] mm/hugetlb: improve locking in  dissolve_free_huge_pages() Michal Hocko <mhocko@kernel.org> - 2016-09-29 14:40 +0200
  [PATCH v4 1/3] mm/hugetlb: fix memory offline with hugepage size > memory block size Gerald Schaefer <gerald.schaefer@de.ibm.com> - 2016-09-26 19:30 +0200
    Re: [PATCH v4 1/3] mm/hugetlb: fix memory offline with hugepage size  > memory block size Michal Hocko <mhocko@kernel.org> - 2016-09-29 14:20 +0200
  Re: [PATCH v4 0/3] mm/hugetlb: memory offline issues with hugepages Naoya Horiguchi <n-horiguchi@ah.jp.nec.com> - 2016-09-29 08:20 +0200

csiph-web