aboutsummaryrefslogtreecommitdiffstats
path: root/mm/hugetlb.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/hugetlb.c')
-rw-r--r--mm/hugetlb.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/mm/hugetlb.c b/mm/hugetlb.c
index 87e11d8ad536..603bdd01ec2c 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
@@ -1443,13 +1443,14 @@ static void dissolve_free_huge_page(struct page *page)
1443{ 1443{
1444 spin_lock(&hugetlb_lock); 1444 spin_lock(&hugetlb_lock);
1445 if (PageHuge(page) && !page_count(page)) { 1445 if (PageHuge(page) && !page_count(page)) {
1446 struct hstate *h = page_hstate(page); 1446 struct page *head = compound_head(page);
1447 int nid = page_to_nid(page); 1447 struct hstate *h = page_hstate(head);
1448 list_del(&page->lru); 1448 int nid = page_to_nid(head);
1449 list_del(&head->lru);
1449 h->free_huge_pages--; 1450 h->free_huge_pages--;
1450 h->free_huge_pages_node[nid]--; 1451 h->free_huge_pages_node[nid]--;
1451 h->max_huge_pages--; 1452 h->max_huge_pages--;
1452 update_and_free_page(h, page); 1453 update_and_free_page(h, head);
1453 } 1454 }
1454 spin_unlock(&hugetlb_lock); 1455 spin_unlock(&hugetlb_lock);
1455} 1456}
@@ -1457,7 +1458,8 @@ static void dissolve_free_huge_page(struct page *page)
1457/* 1458/*
1458 * Dissolve free hugepages in a given pfn range. Used by memory hotplug to 1459 * Dissolve free hugepages in a given pfn range. Used by memory hotplug to
1459 * make specified memory blocks removable from the system. 1460 * make specified memory blocks removable from the system.
1460 * Note that start_pfn should aligned with (minimum) hugepage size. 1461 * Note that this will dissolve a free gigantic hugepage completely, if any
1462 * part of it lies within the given range.
1461 */ 1463 */
1462void dissolve_free_huge_pages(unsigned long start_pfn, unsigned long end_pfn) 1464void dissolve_free_huge_pages(unsigned long start_pfn, unsigned long end_pfn)
1463{ 1465{
@@ -1466,7 +1468,6 @@ void dissolve_free_huge_pages(unsigned long start_pfn, unsigned long end_pfn)
1466 if (!hugepages_supported()) 1468 if (!hugepages_supported())
1467 return; 1469 return;
1468 1470
1469 VM_BUG_ON(!IS_ALIGNED(start_pfn, 1 << minimum_order));
1470 for (pfn = start_pfn; pfn < end_pfn; pfn += 1 << minimum_order) 1471 for (pfn = start_pfn; pfn < end_pfn; pfn += 1 << minimum_order)
1471 dissolve_free_huge_page(pfn_to_page(pfn)); 1472 dissolve_free_huge_page(pfn_to_page(pfn));
1472} 1473}