@@ -417,11 +417,9 @@ extern struct page *lookup_swap_cache(swp_entry_t entry,
struct vm_area_struct *vma,
unsigned long addr);
extern struct page *read_swap_cache_async(swp_entry_t, gfp_t,
- struct vm_area_struct *vma, unsigned long addr,
- bool do_poll);
+ struct vm_fault *vmf, bool do_poll);
extern struct page *__read_swap_cache_async(swp_entry_t, gfp_t,
- struct vm_area_struct *vma, unsigned long addr,
- bool *new_page_allocated);
+ struct vm_fault *vmf, bool *new_page_allocated);
extern struct page *swap_cluster_readahead(swp_entry_t entry, gfp_t flag,
struct vm_fault *vmf);
extern struct page *swapin_readahead(swp_entry_t entry, gfp_t flag,
@@ -184,8 +184,8 @@ static int swapin_walk_pmd_entry(pmd_t *pmd, unsigned long start,
unsigned long end, struct mm_walk *walk)
{
pte_t *orig_pte;
- struct vm_area_struct *vma = walk->private;
unsigned long index;
+ struct vm_fault vmf = { .vma = walk->private};
if (pmd_none_or_trans_huge_or_clear_bad(pmd))
return 0;
@@ -196,7 +196,8 @@ static int swapin_walk_pmd_entry(pmd_t *pmd, unsigned long start,
struct page *page;
spinlock_t *ptl;
- orig_pte = pte_offset_map_lock(vma->vm_mm, pmd, start, &ptl);
+ orig_pte = pte_offset_map_lock(vmf.vma->vm_mm,
+ pmd, start, &ptl);
pte = *(orig_pte + ((index - start) / PAGE_SIZE));
pte_unmap_unlock(orig_pte, ptl);
@@ -206,8 +207,9 @@ static int swapin_walk_pmd_entry(pmd_t *pmd, unsigned long start,
if (unlikely(non_swap_entry(entry)))
continue;
+ vmf.address = index;
page = read_swap_cache_async(entry, GFP_HIGHUSER_MOVABLE,
- vma, index, false);
+ &vmf, false);
if (page)
put_page(page);
}
@@ -226,6 +228,7 @@ static void force_shm_swapin_readahead(struct vm_area_struct *vma,
pgoff_t index;
struct page *page;
swp_entry_t swap;
+ struct vm_fault vmf = { .vma = NULL, .address = 0};
for (; start < end; start += PAGE_SIZE) {
index = ((start - vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff;
@@ -238,7 +241,7 @@ static void force_shm_swapin_readahead(struct vm_area_struct *vma,
}
swap = radix_to_swp_entry(page);
page = read_swap_cache_async(swap, GFP_HIGHUSER_MOVABLE,
- NULL, 0, false);
+ &vmf, false);
if (page)
put_page(page);
}
@@ -1437,16 +1437,15 @@ static void shmem_pseudo_vma_destroy(struct vm_area_struct *vma)
}
static struct page *shmem_swapin(swp_entry_t swap, gfp_t gfp,
- struct shmem_inode_info *info, pgoff_t index)
+ struct vm_fault *vmf, struct shmem_inode_info *info, pgoff_t index)
{
struct vm_area_struct pvma;
struct page *page;
- struct vm_fault vmf;
shmem_pseudo_vma_init(&pvma, info, index);
- vmf.vma = &pvma;
- vmf.address = 0;
- page = swap_cluster_readahead(swap, gfp, &vmf);
+ vmf->vma = &pvma;
+ vmf->address = 0;
+ page = swap_cluster_readahead(swap, gfp, vmf);
shmem_pseudo_vma_destroy(&pvma);
return page;
@@ -1621,6 +1620,7 @@ static int shmem_swapin_page(struct inode *inode, pgoff_t index,
struct mm_struct *charge_mm = vma ? vma->vm_mm : current->mm;
struct mem_cgroup *memcg;
struct page *page;
+ struct vm_fault vmf;
swp_entry_t swap;
int error;
@@ -1638,7 +1638,7 @@ static int shmem_swapin_page(struct inode *inode, pgoff_t index,
count_memcg_event_mm(charge_mm, PGMAJFAULT);
}
/* Here we actually start the io */
- page = shmem_swapin(swap, gfp, info, index);
+ page = shmem_swapin(swap, gfp, &vmf, info, index);
if (!page) {
error = -ENOMEM;
goto failed;
@@ -357,11 +357,12 @@ struct page *lookup_swap_cache(swp_entry_t entry, struct vm_area_struct *vma,
}
struct page *__read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask,
- struct vm_area_struct *vma, unsigned long addr,
- bool *new_page_allocated)
+ struct vm_fault *vmf, bool *new_page_allocated)
{
struct page *found_page = NULL, *new_page = NULL;
struct swap_info_struct *si;
+ struct vm_area_struct *vma = vmf->vma;
+ unsigned long addr = vmf->address;
int err;
*new_page_allocated = false;
@@ -446,11 +447,11 @@ struct page *__read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask,
* the swap entry is no longer in use.
*/
struct page *read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask,
- struct vm_area_struct *vma, unsigned long addr, bool do_poll)
+ struct vm_fault *vmf, bool do_poll)
{
bool page_was_allocated;
struct page *retpage = __read_swap_cache_async(entry, gfp_mask,
- vma, addr, &page_was_allocated);
+ vmf, &page_was_allocated);
if (page_was_allocated)
swap_readpage(retpage, do_poll);
@@ -547,8 +548,6 @@ struct page *swap_cluster_readahead(swp_entry_t entry, gfp_t gfp_mask,
struct swap_info_struct *si = swp_swap_info(entry);
struct blk_plug plug;
bool do_poll = true, page_allocated;
- struct vm_area_struct *vma = vmf->vma;
- unsigned long addr = vmf->address;
mask = swapin_nr_pages(offset) - 1;
if (!mask)
@@ -575,7 +574,7 @@ struct page *swap_cluster_readahead(swp_entry_t entry, gfp_t gfp_mask,
/* Ok, do the async read-ahead now */
page = __read_swap_cache_async(
swp_entry(swp_type(entry), offset),
- gfp_mask, vma, addr, &page_allocated);
+ gfp_mask, vmf, &page_allocated);
if (!page)
continue;
if (page_allocated) {
@@ -591,7 +590,7 @@ struct page *swap_cluster_readahead(swp_entry_t entry, gfp_t gfp_mask,
lru_add_drain(); /* Push any new pages onto the LRU now */
skip:
- return read_swap_cache_async(entry, gfp_mask, vma, addr, do_poll);
+ return read_swap_cache_async(entry, gfp_mask, vmf, do_poll);
}
int init_swap_address_space(unsigned int type, unsigned long nr_pages)
@@ -723,7 +722,6 @@ static struct page *swap_vma_readahead(swp_entry_t fentry, gfp_t gfp_mask,
struct vm_fault *vmf)
{
struct blk_plug plug;
- struct vm_area_struct *vma = vmf->vma;
struct page *page;
pte_t *pte, pentry;
swp_entry_t entry;
@@ -746,8 +744,8 @@ static struct page *swap_vma_readahead(swp_entry_t fentry, gfp_t gfp_mask,
entry = pte_to_swp_entry(pentry);
if (unlikely(non_swap_entry(entry)))
continue;
- page = __read_swap_cache_async(entry, gfp_mask, vma,
- vmf->address, &page_allocated);
+ page = __read_swap_cache_async(entry, gfp_mask, vmf,
+ &page_allocated);
if (!page)
continue;
if (page_allocated) {
@@ -762,8 +760,7 @@ static struct page *swap_vma_readahead(swp_entry_t fentry, gfp_t gfp_mask,
blk_finish_plug(&plug);
lru_add_drain();
skip:
- return read_swap_cache_async(fentry, gfp_mask, vma, vmf->address,
- ra_info.win == 1);
+ return read_swap_cache_async(fentry, gfp_mask, vmf, ra_info.win == 1);
}
/**
@@ -1850,11 +1850,13 @@ static inline int pte_same_as_swp(pte_t pte, pte_t swp_pte)
* just let do_wp_page work it out if a write is requested later - to
* force COW, vm_page_prot omits write permission from any private vma.
*/
-static int unuse_pte(struct vm_area_struct *vma, pmd_t *pmd,
- unsigned long addr, swp_entry_t entry, struct page *page)
+static int unuse_pte(struct vm_fault *vmf, swp_entry_t entry, struct page *page)
{
struct page *swapcache;
struct mem_cgroup *memcg;
+ struct vm_area_struct *vma = vmf->vma;
+ pmd_t *pmd = vmf->pmd;
+ unsigned long addr = vmf->address;
spinlock_t *ptl;
pte_t *pte;
int ret = 1;
@@ -1949,7 +1951,7 @@ static int unuse_pte_range(struct vm_area_struct *vma, pmd_t *pmd,
lock_page(page);
wait_on_page_writeback(page);
- ret = unuse_pte(vma, pmd, addr, entry, page);
+ ret = unuse_pte(&vmf, entry, page);
if (ret < 0) {
unlock_page(page);
put_page(page);
@@ -846,9 +846,10 @@ static int zswap_get_swap_cache_page(swp_entry_t entry,
struct page **retpage)
{
bool page_was_allocated;
+ struct vm_fault vmf = { .vma = NULL, .address = 0};
*retpage = __read_swap_cache_async(entry, GFP_KERNEL,
- NULL, 0, &page_was_allocated);
+ &vmf, &page_was_allocated);
if (page_was_allocated)
return ZSWAP_SWAPCACHE_NEW;
if (!*retpage)
Folding parameter struct vm_area_struct *vma, unsigned long addr into struct vm_fault vmf, this makes func path more readble, and give a chance to pass more parameters as vmf fields on these series funcs. No functional change yet. Signed-off-by: Alex Shi <alex.shi@linux.alibaba.com> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: linux-kernel@vger.kernel.org Cc: linux-mm@kvack.org --- include/linux/swap.h | 6 ++---- mm/madvise.c | 11 +++++++---- mm/shmem.c | 12 ++++++------ mm/swap_state.c | 23 ++++++++++------------- mm/swapfile.c | 8 +++++--- mm/zswap.c | 3 ++- 6 files changed, 32 insertions(+), 31 deletions(-)