|
@@ -2481,6 +2481,9 @@ int split_huge_page_to_list(struct page *page, struct list_head *list)
|
|
|
VM_BUG_ON_PAGE(!PageLocked(page), page);
|
|
|
VM_BUG_ON_PAGE(!PageCompound(page), page);
|
|
|
|
|
|
+ if (PageWriteback(page))
|
|
|
+ return -EBUSY;
|
|
|
+
|
|
|
if (PageAnon(head)) {
|
|
|
/*
|
|
|
* The caller does not necessarily hold an mmap_sem that would
|
|
@@ -2558,7 +2561,12 @@ int split_huge_page_to_list(struct page *page, struct list_head *list)
|
|
|
__dec_node_page_state(page, NR_SHMEM_THPS);
|
|
|
spin_unlock(&pgdata->split_queue_lock);
|
|
|
__split_huge_page(page, list, flags);
|
|
|
- ret = 0;
|
|
|
+ if (PageSwapCache(head)) {
|
|
|
+ swp_entry_t entry = { .val = page_private(head) };
|
|
|
+
|
|
|
+ ret = split_swap_cluster(entry);
|
|
|
+ } else
|
|
|
+ ret = 0;
|
|
|
} else {
|
|
|
if (IS_ENABLED(CONFIG_DEBUG_VM) && mapcount) {
|
|
|
pr_alert("total_mapcount: %u, page_count(): %u\n",
|