|
@@ -868,7 +868,6 @@ no_page:
|
|
|
return n_ret;
|
|
|
}
|
|
|
|
|
|
-#ifdef CONFIG_THP_SWAP
|
|
|
static int swap_alloc_cluster(struct swap_info_struct *si, swp_entry_t *slot)
|
|
|
{
|
|
|
unsigned long idx;
|
|
@@ -876,6 +875,15 @@ static int swap_alloc_cluster(struct swap_info_struct *si, swp_entry_t *slot)
|
|
|
unsigned long offset, i;
|
|
|
unsigned char *map;
|
|
|
|
|
|
+ /*
|
|
|
+ * Should not even be attempting cluster allocations when huge
|
|
|
+ * page swap is disabled. Warn and fail the allocation.
|
|
|
+ */
|
|
|
+ if (!IS_ENABLED(CONFIG_THP_SWAP)) {
|
|
|
+ VM_WARN_ON_ONCE(1);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
if (cluster_list_empty(&si->free_clusters))
|
|
|
return 0;
|
|
|
|
|
@@ -906,13 +914,6 @@ static void swap_free_cluster(struct swap_info_struct *si, unsigned long idx)
|
|
|
unlock_cluster(ci);
|
|
|
swap_range_free(si, offset, SWAPFILE_CLUSTER);
|
|
|
}
|
|
|
-#else
|
|
|
-static int swap_alloc_cluster(struct swap_info_struct *si, swp_entry_t *slot)
|
|
|
-{
|
|
|
- VM_WARN_ON_ONCE(1);
|
|
|
- return 0;
|
|
|
-}
|
|
|
-#endif /* CONFIG_THP_SWAP */
|
|
|
|
|
|
static unsigned long scan_swap_map(struct swap_info_struct *si,
|
|
|
unsigned char usage)
|
|
@@ -1200,7 +1201,6 @@ static void swapcache_free(swp_entry_t entry)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-#ifdef CONFIG_THP_SWAP
|
|
|
static void swapcache_free_cluster(swp_entry_t entry)
|
|
|
{
|
|
|
unsigned long offset = swp_offset(entry);
|
|
@@ -1211,6 +1211,9 @@ static void swapcache_free_cluster(swp_entry_t entry)
|
|
|
unsigned int i, free_entries = 0;
|
|
|
unsigned char val;
|
|
|
|
|
|
+ if (!IS_ENABLED(CONFIG_THP_SWAP))
|
|
|
+ return;
|
|
|
+
|
|
|
si = _swap_info_get(entry);
|
|
|
if (!si)
|
|
|
return;
|
|
@@ -1246,6 +1249,7 @@ static void swapcache_free_cluster(swp_entry_t entry)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_THP_SWAP
|
|
|
int split_swap_cluster(swp_entry_t entry)
|
|
|
{
|
|
|
struct swap_info_struct *si;
|
|
@@ -1260,11 +1264,7 @@ int split_swap_cluster(swp_entry_t entry)
|
|
|
unlock_cluster(ci);
|
|
|
return 0;
|
|
|
}
|
|
|
-#else
|
|
|
-static inline void swapcache_free_cluster(swp_entry_t entry)
|
|
|
-{
|
|
|
-}
|
|
|
-#endif /* CONFIG_THP_SWAP */
|
|
|
+#endif
|
|
|
|
|
|
void put_swap_page(struct page *page, swp_entry_t entry)
|
|
|
{
|
|
@@ -1414,7 +1414,6 @@ out:
|
|
|
return count;
|
|
|
}
|
|
|
|
|
|
-#ifdef CONFIG_THP_SWAP
|
|
|
static bool swap_page_trans_huge_swapped(struct swap_info_struct *si,
|
|
|
swp_entry_t entry)
|
|
|
{
|
|
@@ -1425,6 +1424,9 @@ static bool swap_page_trans_huge_swapped(struct swap_info_struct *si,
|
|
|
int i;
|
|
|
bool ret = false;
|
|
|
|
|
|
+ if (!IS_ENABLED(CONFIG_THP_SWAP))
|
|
|
+ return swap_swapcount(si, entry) != 0;
|
|
|
+
|
|
|
ci = lock_cluster_or_swap_info(si, offset);
|
|
|
if (!ci || !cluster_is_huge(ci)) {
|
|
|
if (map[roffset] != SWAP_HAS_CACHE)
|
|
@@ -1447,7 +1449,7 @@ static bool page_swapped(struct page *page)
|
|
|
swp_entry_t entry;
|
|
|
struct swap_info_struct *si;
|
|
|
|
|
|
- if (likely(!PageTransCompound(page)))
|
|
|
+ if (!IS_ENABLED(CONFIG_THP_SWAP) || likely(!PageTransCompound(page)))
|
|
|
return page_swapcount(page) != 0;
|
|
|
|
|
|
page = compound_head(page);
|
|
@@ -1471,10 +1473,8 @@ static int page_trans_huge_map_swapcount(struct page *page, int *total_mapcount,
|
|
|
/* hugetlbfs shouldn't call it */
|
|
|
VM_BUG_ON_PAGE(PageHuge(page), page);
|
|
|
|
|
|
- if (likely(!PageTransCompound(page))) {
|
|
|
- mapcount = atomic_read(&page->_mapcount) + 1;
|
|
|
- if (total_mapcount)
|
|
|
- *total_mapcount = mapcount;
|
|
|
+ if (!IS_ENABLED(CONFIG_THP_SWAP) || likely(!PageTransCompound(page))) {
|
|
|
+ mapcount = page_trans_huge_mapcount(page, total_mapcount);
|
|
|
if (PageSwapCache(page))
|
|
|
swapcount = page_swapcount(page);
|
|
|
if (total_swapcount)
|
|
@@ -1521,26 +1521,6 @@ static int page_trans_huge_map_swapcount(struct page *page, int *total_mapcount,
|
|
|
|
|
|
return map_swapcount;
|
|
|
}
|
|
|
-#else
|
|
|
-#define swap_page_trans_huge_swapped(si, entry) swap_swapcount(si, entry)
|
|
|
-#define page_swapped(page) (page_swapcount(page) != 0)
|
|
|
-
|
|
|
-static int page_trans_huge_map_swapcount(struct page *page, int *total_mapcount,
|
|
|
- int *total_swapcount)
|
|
|
-{
|
|
|
- int mapcount, swapcount = 0;
|
|
|
-
|
|
|
- /* hugetlbfs shouldn't call it */
|
|
|
- VM_BUG_ON_PAGE(PageHuge(page), page);
|
|
|
-
|
|
|
- mapcount = page_trans_huge_mapcount(page, total_mapcount);
|
|
|
- if (PageSwapCache(page))
|
|
|
- swapcount = page_swapcount(page);
|
|
|
- if (total_swapcount)
|
|
|
- *total_swapcount = swapcount;
|
|
|
- return mapcount + swapcount;
|
|
|
-}
|
|
|
-#endif
|
|
|
|
|
|
/*
|
|
|
* We can write to an anon page without COW if there are no other references
|