Due to the relocation of pmd locking, mm_walk->skip becomes less important because only walk_page_test() and walk->test_walk() use it. None of these functions uses a positive value as a return value, so we can define it to determine whether we skip the current vma or not. Thus this patch removes mm_walk->skip. Signed-off-by: Naoya Horiguchi <n-horiguchi@xxxxxxxxxxxxx> --- fs/proc/task_mmu.c | 4 ++-- include/linux/mm.h | 3 --- mm/mempolicy.c | 9 ++++----- mm/pagewalk.c | 36 ++++++++---------------------------- 4 files changed, 14 insertions(+), 38 deletions(-) diff --git mmotm-2014-05-21-16-57.orig/fs/proc/task_mmu.c mmotm-2014-05-21-16-57/fs/proc/task_mmu.c index 059206ea3c6b..8211f6c8236d 100644 --- mmotm-2014-05-21-16-57.orig/fs/proc/task_mmu.c +++ mmotm-2014-05-21-16-57/fs/proc/task_mmu.c @@ -755,9 +755,9 @@ static int clear_refs_test_walk(unsigned long start, unsigned long end, * Writing 4 to /proc/pid/clear_refs affects all pages. */ if (cp->type == CLEAR_REFS_ANON && vma->vm_file) - walk->skip = 1; + return 1; if (cp->type == CLEAR_REFS_MAPPED && !vma->vm_file) - walk->skip = 1; + return 1; if (cp->type == CLEAR_REFS_SOFT_DIRTY) { if (vma->vm_flags & VM_SOFTDIRTY) vma->vm_flags &= ~VM_SOFTDIRTY; diff --git mmotm-2014-05-21-16-57.orig/include/linux/mm.h mmotm-2014-05-21-16-57/include/linux/mm.h index aa832161a1ff..0a20674c84e2 100644 --- mmotm-2014-05-21-16-57.orig/include/linux/mm.h +++ mmotm-2014-05-21-16-57/include/linux/mm.h @@ -1106,8 +1106,6 @@ void unmap_vmas(struct mmu_gather *tlb, struct vm_area_struct *start_vma, * right now." 0 means "skip the current vma." * @mm: mm_struct representing the target process of page table walk * @vma: vma currently walked - * @skip: internal control flag which is set when we skip the lower - * level entries. * @pmd: current pmd entry * @ptl: page table lock associated with current entry * @private: private data for callbacks' use @@ -1127,7 +1125,6 @@ struct mm_walk { struct mm_walk *walk); struct mm_struct *mm; struct vm_area_struct *vma; - int skip; pmd_t *pmd; spinlock_t *ptl; void *private; diff --git mmotm-2014-05-21-16-57.orig/mm/mempolicy.c mmotm-2014-05-21-16-57/mm/mempolicy.c index cf3b995b21d0..b8267f753748 100644 --- mmotm-2014-05-21-16-57.orig/mm/mempolicy.c +++ mmotm-2014-05-21-16-57/mm/mempolicy.c @@ -596,22 +596,21 @@ static int queue_pages_test_walk(unsigned long start, unsigned long end, } qp->prev = vma; - walk->skip = 1; if (vma->vm_flags & VM_PFNMAP) - return 0; + return 1; if (flags & MPOL_MF_LAZY) { change_prot_numa(vma, start, endvma); - return 0; + return 1; } if ((flags & MPOL_MF_STRICT) || ((flags & (MPOL_MF_MOVE | MPOL_MF_MOVE_ALL)) && vma_migratable(vma))) /* queue pages from current vma */ - walk->skip = 0; - return 0; + return 0; + return 1; } /* diff --git mmotm-2014-05-21-16-57.orig/mm/pagewalk.c mmotm-2014-05-21-16-57/mm/pagewalk.c index f1a3417d0b51..61d6bd9545d6 100644 --- mmotm-2014-05-21-16-57.orig/mm/pagewalk.c +++ mmotm-2014-05-21-16-57/mm/pagewalk.c @@ -3,24 +3,6 @@ #include <linux/sched.h> #include <linux/hugetlb.h> -/* - * Check the current skip status of page table walker. - * - * Here what I mean by skip is to skip lower level walking, and that was - * determined for each entry independently. For example, when walk_pmd_range - * handles a pmd_trans_huge we don't have to walk over ptes under that pmd, - * and the skipping does not affect the walking over ptes under other pmds. - * That's why we reset @walk->skip after tested. - */ -static bool skip_lower_level_walking(struct mm_walk *walk) -{ - if (walk->skip) { - walk->skip = 0; - return true; - } - return false; -} - static int walk_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end, struct mm_walk *walk) { @@ -89,8 +71,6 @@ static int walk_pmd_range(pud_t *pud, unsigned long addr, err = walk->pmd_entry(pmd, addr, next, walk); spin_unlock(walk->ptl); } - if (skip_lower_level_walking(walk)) - continue; if (err) break; } @@ -225,9 +205,9 @@ static inline int walk_hugetlb_range(unsigned long addr, unsigned long end, /* * Decide whether we really walk over the current vma on [@start, @end) - * or skip it. When we skip it, we set @walk->skip to 1. - * The return value is used to control the page table walking to - * continue (for zero) or not (for non-zero). + * or skip it via the returned value. Return 0 if we do walk over the + * current vma, and return 1 if we skip the vma. Negative values means + * error, where we abort the current walk. * * Default check (only VM_PFNMAP check for now) is used when the caller * doesn't define test_walk() callback. @@ -245,7 +225,7 @@ static int walk_page_test(unsigned long start, unsigned long end, * page backing a VM_PFNMAP range. See also commit a9ff785e4437. */ if (vma->vm_flags & VM_PFNMAP) - walk->skip = 1; + return 1; return 0; } @@ -330,9 +310,9 @@ int walk_page_range(unsigned long start, unsigned long end, next = min(end, vma->vm_end); err = walk_page_test(start, next, walk); - if (skip_lower_level_walking(walk)) + if (err == 1) continue; - if (err) + if (err < 0) break; } err = __walk_page_range(start, next, walk); @@ -353,9 +333,9 @@ int walk_page_vma(struct vm_area_struct *vma, struct mm_walk *walk) VM_BUG_ON(!vma); walk->vma = vma; err = walk_page_test(vma->vm_start, vma->vm_end, walk); - if (skip_lower_level_walking(walk)) + if (err == 1) return 0; - if (err) + if (err < 0) return err; return __walk_page_range(vma->vm_start, vma->vm_end, walk); } -- 1.9.3 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>