|
@@ -1479,22 +1479,20 @@ 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. Returns -EBUSY if the
|
|
|
- * number of free hugepages would be reduced below the number of reserved
|
|
|
- * hugepages.
|
|
|
+ * dissolution fails because a give page is not a free hugepage, or because
|
|
|
+ * free hugepages are fully reserved.
|
|
|
*/
|
|
|
int dissolve_free_huge_page(struct page *page)
|
|
|
{
|
|
|
- int rc = 0;
|
|
|
+ int rc = -EBUSY;
|
|
|
|
|
|
spin_lock(&hugetlb_lock);
|
|
|
if (PageHuge(page) && !page_count(page)) {
|
|
|
struct page *head = compound_head(page);
|
|
|
struct hstate *h = page_hstate(head);
|
|
|
int nid = page_to_nid(head);
|
|
|
- if (h->free_huge_pages - h->resv_huge_pages == 0) {
|
|
|
- rc = -EBUSY;
|
|
|
+ if (h->free_huge_pages - h->resv_huge_pages == 0)
|
|
|
goto out;
|
|
|
- }
|
|
|
/*
|
|
|
* Move PageHWPoison flag from head page to the raw error page,
|
|
|
* which makes any subpages rather than the error page reusable.
|
|
@@ -1508,6 +1506,7 @@ int dissolve_free_huge_page(struct page *page)
|
|
|
h->free_huge_pages_node[nid]--;
|
|
|
h->max_huge_pages--;
|
|
|
update_and_free_page(h, head);
|
|
|
+ rc = 0;
|
|
|
}
|
|
|
out:
|
|
|
spin_unlock(&hugetlb_lock);
|