swap readahead clean up
Subsystems (4)
v2 cover swap readahead clean up
This patchset cleans up recent added vma-based readahead code via unifying cluster-based readahead.
* From v1
* renamed swap_cluster_readahead - Huang
* remove unnecessary extern declaration - Huang
* add description for swapin_readahead - Huang
Minchan Kim (2):
mm:swap: clean up swap readahead
mm:swap: unify cluster-based and vma-based swap readahead
include/linux/swap.h | 38 +++----------- mm/memory.c | 24 +++------ mm/shmem.c | 5 +- mm/swap_state.c | 137 ++++++++++++++++++++++++++++++++------------------- 4 files changed, 103 insertions(+), 101 deletions(-)
Signature · 7 lines
2.7.4 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
PATCH v2 1/2 mm:swap: clean up swap readahead
When I see recent change of swap readahead, I am very unhappy about current code structure which diverges two swap readahead algorithm in do_swap_page. This patch is to clean it up.
Main motivation is that fault handler doesn't need to be aware of readahead algorithms but just should call swapin_readahead.
As first step, this patch cleans up a little bit but not perfect (I just separate for review easier) so next patch will make the goal complete.
--- include/linux/swap.h | 17 ++-------- mm/memory.c | 17 +++------- mm/swap_state.c | 89 ++++++++++++++++++++++++++++------------------------ 3 files changed, 55 insertions(+), 68 deletions(-)
include/linux/swap.h +3 -14
@@ -427,12 +427,8 @@ extern struct page *__read_swap_cache_async(swp_entry_t, gfp_t, bool *new_page_allocated);extern struct page *swapin_readahead (swp_entry_t ,gfp_t ,struct vm_area_struct *vma,unsigned long addr); - -extern struct page *swap_readahead_detect (struct vm_fault *vmf, -struct vma_swap_readahead *swap_ra);extern struct page *do_swap_page_readahead (swp_entry_t fentry,gfp_t gfp_mask, -struct vm_fault *vmf, -struct vma_swap_readahead *swap_ra); +struct vm_fault *vmf);/* linux/mm/swapfile.c */ extern atomic_long_t nr_swap_pages;
@@ -551,15 +547,8 @@ static inline bool swap_use_vma_readahead(void)return false; } -static inline struct page *swap_readahead_detect ( -struct vm_fault *vmf,struct vma_swap_readahead *swap_ra) -{ -return NULL ; -} - -static inline struct page *do_swap_page_readahead ( -swp_entry_t fentry,gfp_t gfp_mask, -struct vm_fault *vmf,struct vma_swap_readahead *swap_ra) +static inline struct page *do_swap_page_readahead (swp_entry_t fentry, +gfp_t gfp_mask,struct vm_fault *vmf) {return NULL ; }
mm/memory.c +4 -13
@@ -2849,21 +2849,14 @@ int do_swap_page(struct vm_fault *vmf)struct vm_area_struct *vma = vmf->vma;struct page *page =NULL , *swapcache =NULL ;struct mem_cgroup *memcg; -struct vma_swap_readahead swap_ra;swp_entry_t entry;pte_t pte;int locked;int exclusive =0 ;int ret =0 ; -bool vma_readahead =swap_use_vma_readahead (); -if (vma_readahead) - page =swap_readahead_detect (vmf, &swap_ra); -if (!pte_unmap_same (vma->vm_mm, vmf->pmd, vmf->pte, vmf->orig_pte)) { -if (page) -put_page (page); +if (!pte_unmap_same (vma->vm_mm, vmf->pmd, vmf->pte, vmf->orig_pte)) goto out; - } entry =pte_to_swp_entry (vmf->orig_pte);if (unlikely (non_swap_entry (entry))) {
@@ -2889,9 +2882,7 @@ int do_swap_page(struct vm_fault *vmf)delayacct_set_flag (DELAYACCT_PF_SWAPIN ); -if (!page) - page =lookup_swap_cache (entry, vma_readahead ? vma :NULL , - vmf->address); + page =lookup_swap_cache (entry, vma, vmf->address);if (!page) {struct swap_info_struct *si =swp_swap_info (entry);
@@ -2907,9 +2898,9 @@ int do_swap_page(struct vm_fault *vmf)swap_readpage (page, true); } }else { -if (vma_readahead) +if (swap_use_vma_readahead ()) page =do_swap_page_readahead (entry, -GFP_HIGHUSER_MOVABLE , vmf, &swap_ra); +GFP_HIGHUSER_MOVABLE , vmf);else page =swapin_readahead (entry,GFP_HIGHUSER_MOVABLE , vma, vmf->address);
mm/swap_state.c +48 -41
175 lines not on this page · raw message
Signature · 7 lines
2.7.4 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
PATCH v2 2/2 mm:swap: unify cluster-based and vma-based swap readahead
In reply to Minchan KimThis patch makes do_swap_page no need to be aware of two different swap readahead algorithm. Just unify cluster-based and vma-based readahead function call.
--- include/linux/swap.h | 27 ++++++++------------------- mm/memory.c | 11 ++++------- mm/shmem.c | 5 ++++- mm/swap_state.c | 48 +++++++++++++++++++++++++++++++++++++----------- 4 files changed, 53 insertions(+), 38 deletions(-)
include/linux/swap.h +8 -19
@@ -403,7 +403,6 @@ int generic_swapfile_activate(struct swap_info_struct *, struct file *,#define SWAP_ADDRESS_SPACE_SHIFT 14#define SWAP_ADDRESS_SPACE_PAGES (1 << SWAP_ADDRESS_SPACE_SHIFT)extern struct address_space *swapper_spaces[]; -extern bool swap_vma_readahead;#define swap_address_space (entry) \ (&swapper_spaces[swp_type(entry)][swp_offset(entry) \ >> SWAP_ADDRESS_SPACE_SHIFT])
@@ -425,10 +424,10 @@ extern struct page *read_swap_cache_async(swp_entry_t, gfp_t,extern struct page *__read_swap_cache_async (swp_entry_t ,gfp_t ,struct vm_area_struct *vma,unsigned long addr,bool *new_page_allocated); -extern struct page *swapin_readahead (swp_entry_t ,gfp_t , -struct vm_area_struct *vma,unsigned long addr); -extern struct page *do_swap_page_readahead (swp_entry_t fentry,gfp_t gfp_mask, -struct vm_fault *vmf); +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, +struct vm_fault *vmf);/* linux/mm/swapfile.c */ extern atomic_long_t nr_swap_pages;
@@ -436,11 +435,6 @@ extern long total_swap_pages;extern atomic_t nr_rotate_swap;extern bool has_usable_swap (void ); -static inline bool swap_use_vma_readahead (void ) -{ -return READ_ONCE (swap_vma_readahead) && !atomic_read (&nr_rotate_swap); -} -/* Swap 50% full? Release swapcache more aggressively.. */ static inline bool vm_swap_full (void ) {
@@ -536,19 +530,14 @@ static inline void put_swap_page(struct page *page, swp_entry_t swp) { } -static inline struct page *swapin_readahead (swp_entry_t swp,gfp_t gfp_mask, -struct vm_area_struct *vma,unsigned long addr) +static inline struct page *swap_cluster_readahead (swp_entry_t entry, +gfp_t gfp_mask,struct vm_fault *vmf) {return NULL ; } -static inline bool swap_use_vma_readahead (void ) -{ -return false; -} - -static inline struct page *do_swap_page_readahead (swp_entry_t fentry, -gfp_t gfp_mask,struct vm_fault *vmf) +static inline struct page *swapin_readahead (swp_entry_t swp,gfp_t gfp_mask, +struct vm_fault *vmf) {return NULL ; }
mm/memory.c +4 -7
@@ -2889,7 +2889,8 @@ int do_swap_page(struct vm_fault *vmf)if (si->flags &SWP_SYNCHRONOUS_IO &&__swap_count (si, entry) ==1 ) {/* skip swapcache */ - page =alloc_page_vma (GFP_HIGHUSER_MOVABLE , vma, vmf->address); + page =alloc_page_vma (GFP_HIGHUSER_MOVABLE , vma, + vmf->address);if (page) {__SetPageLocked (page);__SetPageSwapBacked (page);
@@ -2898,12 +2899,8 @@ int do_swap_page(struct vm_fault *vmf)swap_readpage (page, true); } }else { -if (swap_use_vma_readahead ()) - page =do_swap_page_readahead (entry, -GFP_HIGHUSER_MOVABLE , vmf); -else - page =swapin_readahead (entry, -GFP_HIGHUSER_MOVABLE , vma, vmf->address); + page =swapin_readahead (entry,GFP_HIGHUSER_MOVABLE , + vmf); swapcache = page; }
mm/shmem.c +4 -1
@@ -1413,9 +1413,12 @@ static struct page *shmem_swapin(swp_entry_t swap, gfp_t gfp, {struct vm_area_struct pvma;struct page *page; +struct vm_fault vmf;shmem_pseudo_vma_init (&pvma, info, index); - page =swapin_readahead (swap, gfp, &pvma,0 ); + vmf.vma = &pvma; + vmf.address =0 ; + page =swap_cluster_readahead (swap, gfp, &vmf);shmem_pseudo_vma_destroy (&pvma);return page;
mm/swap_state.c +37 -11
104 lines not on this page · raw message
Signature · 7 lines
2.7.4 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>