diff options
Diffstat (limited to 'mm/hugetlb.c')
-rw-r--r-- | mm/hugetlb.c | 13 |
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 | */ |
1462 | void dissolve_free_huge_pages(unsigned long start_pfn, unsigned long end_pfn) | 1464 | void 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 | } |