Skip to content

Commit

Permalink
mm, swap, get_swap_pages: use entry_size instead of cluster in parameter
Browse files Browse the repository at this point in the history
As suggested by Matthew Wilcox, it is better to use "int entry_size"
instead of "bool cluster" as parameter to specify whether to operate for
huge or normal swap entries.  Because this improve the flexibility to
support other swap entry size.  And Dave Hansen thinks that this
improves code readability too.

So in this patch, the "bool cluster" parameter of get_swap_pages() is
replaced by "int entry_size".

And nr_swap_entries() trick is used to reduce the binary size when
!CONFIG_TRANSPARENT_HUGE_PAGE.

       text	   data	    bss	    dec	    hex	filename
base  24215	   2028	    340	  26583	   67d7	mm/swapfile.o
head  24123	   2004	    340	  26467	   6763	mm/swapfile.o

Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: "Huang, Ying" <[email protected]>
Suggested-by: Matthew Wilcox <[email protected]>
Acked-by: Dave Hansen <[email protected]>
Cc: Daniel Jordan <[email protected]>
Cc: Michal Hocko <[email protected]>
Cc: Johannes Weiner <[email protected]>
Cc: Shaohua Li <[email protected]>
Cc: Hugh Dickins <[email protected]>
Cc: Minchan Kim <[email protected]>
Cc: Rik van Riel <[email protected]>
Cc: Dan Williams <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
yhuang-intel authored and torvalds committed Aug 22, 2018
1 parent a448f2d commit 5d5e8f1
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 13 deletions.
2 changes: 1 addition & 1 deletion include/linux/swap.h
Original file line number Diff line number Diff line change
Expand Up @@ -447,7 +447,7 @@ extern void si_swapinfo(struct sysinfo *);
extern swp_entry_t get_swap_page(struct page *page);
extern void put_swap_page(struct page *page, swp_entry_t entry);
extern swp_entry_t get_swap_page_of_type(int);
extern int get_swap_pages(int n, bool cluster, swp_entry_t swp_entries[]);
extern int get_swap_pages(int n, swp_entry_t swp_entries[], int entry_size);
extern int add_swap_count_continuation(swp_entry_t, gfp_t);
extern void swap_shmem_alloc(swp_entry_t);
extern int swap_duplicate(swp_entry_t);
Expand Down
8 changes: 4 additions & 4 deletions mm/swap_slots.c
Original file line number Diff line number Diff line change
Expand Up @@ -269,8 +269,8 @@ static int refill_swap_slots_cache(struct swap_slots_cache *cache)

cache->cur = 0;
if (swap_slot_cache_active)
cache->nr = get_swap_pages(SWAP_SLOTS_CACHE_SIZE, false,
cache->slots);
cache->nr = get_swap_pages(SWAP_SLOTS_CACHE_SIZE,
cache->slots, 1);

return cache->nr;
}
Expand Down Expand Up @@ -316,7 +316,7 @@ swp_entry_t get_swap_page(struct page *page)

if (PageTransHuge(page)) {
if (IS_ENABLED(CONFIG_THP_SWAP))
get_swap_pages(1, true, &entry);
get_swap_pages(1, &entry, HPAGE_PMD_NR);
goto out;
}

Expand Down Expand Up @@ -350,7 +350,7 @@ swp_entry_t get_swap_page(struct page *page)
goto out;
}

get_swap_pages(1, false, &entry);
get_swap_pages(1, &entry, 1);
out:
if (mem_cgroup_try_charge_swap(page, entry)) {
put_swap_page(page, entry);
Expand Down
16 changes: 8 additions & 8 deletions mm/swapfile.c
Original file line number Diff line number Diff line change
Expand Up @@ -940,18 +940,18 @@ static unsigned long scan_swap_map(struct swap_info_struct *si,

}

int get_swap_pages(int n_goal, bool cluster, swp_entry_t swp_entries[])
int get_swap_pages(int n_goal, swp_entry_t swp_entries[], int entry_size)
{
unsigned long nr_pages = cluster ? SWAPFILE_CLUSTER : 1;
unsigned long size = swap_entry_size(entry_size);
struct swap_info_struct *si, *next;
long avail_pgs;
int n_ret = 0;
int node;

/* Only single cluster request supported */
WARN_ON_ONCE(n_goal > 1 && cluster);
WARN_ON_ONCE(n_goal > 1 && size == SWAPFILE_CLUSTER);

avail_pgs = atomic_long_read(&nr_swap_pages) / nr_pages;
avail_pgs = atomic_long_read(&nr_swap_pages) / size;
if (avail_pgs <= 0)
goto noswap;

Expand All @@ -961,7 +961,7 @@ int get_swap_pages(int n_goal, bool cluster, swp_entry_t swp_entries[])
if (n_goal > avail_pgs)
n_goal = avail_pgs;

atomic_long_sub(n_goal * nr_pages, &nr_swap_pages);
atomic_long_sub(n_goal * size, &nr_swap_pages);

spin_lock(&swap_avail_lock);

Expand All @@ -988,14 +988,14 @@ int get_swap_pages(int n_goal, bool cluster, swp_entry_t swp_entries[])
spin_unlock(&si->lock);
goto nextsi;
}
if (cluster) {
if (size == SWAPFILE_CLUSTER) {
if (!(si->flags & SWP_FILE))
n_ret = swap_alloc_cluster(si, swp_entries);
} else
n_ret = scan_swap_map_slots(si, SWAP_HAS_CACHE,
n_goal, swp_entries);
spin_unlock(&si->lock);
if (n_ret || cluster)
if (n_ret || size == SWAPFILE_CLUSTER)
goto check_out;
pr_debug("scan_swap_map of si %d failed to find offset\n",
si->type);
Expand All @@ -1021,7 +1021,7 @@ int get_swap_pages(int n_goal, bool cluster, swp_entry_t swp_entries[])

check_out:
if (n_ret < n_goal)
atomic_long_add((long)(n_goal - n_ret) * nr_pages,
atomic_long_add((long)(n_goal - n_ret) * size,
&nr_swap_pages);
noswap:
return n_ret;
Expand Down

0 comments on commit 5d5e8f1

Please sign in to comment.