|
@@ -1476,9 +1476,17 @@ int soft_offline_page(struct page *page, int flags)
|
|
|
{
|
|
|
int ret;
|
|
|
unsigned long pfn = page_to_pfn(page);
|
|
|
+ struct page *hpage = compound_trans_head(page);
|
|
|
|
|
|
if (PageHuge(page))
|
|
|
return soft_offline_huge_page(page, flags);
|
|
|
+ if (PageTransHuge(hpage)) {
|
|
|
+ if (PageAnon(hpage) && unlikely(split_huge_page(hpage))) {
|
|
|
+ pr_info("soft offline: %#lx: failed to split THP\n",
|
|
|
+ pfn);
|
|
|
+ return -EBUSY;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
ret = get_any_page(page, pfn, flags);
|
|
|
if (ret < 0)
|