diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h index 92fd6e2cbaf3799dd6909eb4d530b03609e501a9..a26cbc4398a4b41943cfa70401f76294af1a6b7e 100644 --- a/include/linux/hugetlb.h +++ b/include/linux/hugetlb.h @@ -751,6 +751,11 @@ static inline struct dhugetlb_pool *get_dhugetlb_pool_from_task( { return NULL; } +static inline struct dhugetlb_pool *get_dhugetlb_pool_from_dhugetlb_pagelist( + struct page *page) +{ + return NULL; +} static inline void dhugetlb_pool_put(struct dhugetlb_pool *hpool) { return; } #endif /* CONFIG_DYNAMIC_HUGETLB */ diff --git a/mm/hugetlb.c b/mm/hugetlb.c index 8b88ac4620d548f86794bef9f7971bd8495a8e5d..625882b7cd97f193dc3c02d8053a94cd9da7de00 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -1769,12 +1769,20 @@ static int free_pool_huge_page(struct hstate *h, nodemask_t *nodes_allowed, int dissolve_free_huge_page(struct page *page) { int rc = -EBUSY; + struct dhugetlb_pool *hpool; retry: /* Not to disrupt normal path by vainly holding hugetlb_lock */ if (!PageHuge(page)) return 0; + /* Skip dissolve hugepage for dynamic hugetlb */ + hpool = get_dhugetlb_pool_from_dhugetlb_pagelist(page); + if (hpool) { + dhugetlb_pool_put(hpool); + return -EBUSY; + } + spin_lock(&hugetlb_lock); if (!PageHuge(page)) { rc = 0; @@ -3426,8 +3434,12 @@ struct dhugetlb_pool *get_dhugetlb_pool_from_dhugetlb_pagelist( struct page *page) { struct dhugetlb_pool *hpool = NULL; - unsigned long idx = page_to_pfn(page) >> (PUD_SHIFT - PAGE_SHIFT); + unsigned long idx; + + if (!dhugetlb_enabled) + return NULL; + idx = page_to_pfn(page) >> (PUD_SHIFT - PAGE_SHIFT); read_lock(&dhugetlb_pagelist_rwlock); if (idx < dhugetlb_pagelist_t->count) hpool = dhugetlb_pagelist_t->hpool[idx];