#endif /* CONFIG_SWAP */
 
+#ifdef CONFIG_THP_SWAP
+extern int split_swap_cluster(swp_entry_t entry);
+#else
+static inline int split_swap_cluster(swp_entry_t entry)
+{
+       return 0;
+}
+#endif
+
 #ifdef CONFIG_MEMCG
 static inline int mem_cgroup_swappiness(struct mem_cgroup *memcg)
 {
 
        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
                        __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",
 
                }
        }
 }
+
+int split_swap_cluster(swp_entry_t entry)
+{
+       struct swap_info_struct *si;
+       struct swap_cluster_info *ci;
+       unsigned long offset = swp_offset(entry);
+
+       si = _swap_info_get(entry);
+       if (!si)
+               return -EBUSY;
+       ci = lock_cluster(si, offset);
+       cluster_clear_huge(ci);
+       unlock_cluster(ci);
+       return 0;
+}
 #else
 static inline void swapcache_free_cluster(swp_entry_t entry)
 {