|
|
@@ -1256,12 +1256,23 @@ void free_huge_page(struct page *page)
|
|
|
ClearPagePrivate(page);
|
|
|
|
|
|
/*
|
|
|
- * A return code of zero implies that the subpool will be under its
|
|
|
- * minimum size if the reservation is not restored after page is free.
|
|
|
- * Therefore, force restore_reserve operation.
|
|
|
+ * If PagePrivate() was set on page, page allocation consumed a
|
|
|
+ * reservation. If the page was associated with a subpool, there
|
|
|
+ * would have been a page reserved in the subpool before allocation
|
|
|
+ * via hugepage_subpool_get_pages(). Since we are 'restoring' the
|
|
|
+ * reservtion, do not call hugepage_subpool_put_pages() as this will
|
|
|
+ * remove the reserved page from the subpool.
|
|
|
*/
|
|
|
- if (hugepage_subpool_put_pages(spool, 1) == 0)
|
|
|
- restore_reserve = true;
|
|
|
+ if (!restore_reserve) {
|
|
|
+ /*
|
|
|
+ * A return code of zero implies that the subpool will be
|
|
|
+ * under its minimum size if the reservation is not restored
|
|
|
+ * after page is free. Therefore, force restore_reserve
|
|
|
+ * operation.
|
|
|
+ */
|
|
|
+ if (hugepage_subpool_put_pages(spool, 1) == 0)
|
|
|
+ restore_reserve = true;
|
|
|
+ }
|
|
|
|
|
|
spin_lock(&hugetlb_lock);
|
|
|
clear_page_huge_active(page);
|