prio_tree 2/3: iterator cleanup
Subsystems (6)
PATCH 1/1 prio_tree 2/3: iterator cleanup
Hello.
Currently we have:
while ((vma = vma_prio_tree_next(vma, root, &iter,
begin, end)) != NULL)
do_something_with(vma);Then iter,root,begin,end are all transfered unchanged to various functions. This patch hides them in struct iter instead.
It slightly lessens source, code size, and stack usage.
Oleg.
Signed-off-by Oleg Nesterov <[email protected]>
arch/arm/mm/fault-armv.c +4 -6
@@ -80,7 +80,7 @@ static void __flush_dcache_page(struct p {struct address_space *mapping =page_mapping (page);struct mm_struct *mm = current->active_mm; -struct vm_area_struct *mpnt =NULL ; +struct vm_area_struct *mpnt;struct prio_tree_iter iter;unsigned long offset;pgoff_t pgoff;
@@ -97,8 +97,7 @@ static void __flush_dcache_page(struct p pgoff = page->index << (PAGE_CACHE_SHIFT -PAGE_SHIFT );flush_dcache_mmap_lock (mapping); -while ((mpnt =vma_prio_tree_next (mpnt, &mapping->i_mmap, - &iter, pgoff, pgoff)) !=NULL ) { + vma_prio_tree_foreach(mpnt, &iter, &mapping->i_mmap, pgoff, pgoff) {/* * If this VMA is not in our MM, we can ignore it. */
@@ -128,7 +127,7 @@ make_coherent(struct vm_area_struct *vma {struct address_space *mapping =page_mapping (page);struct mm_struct *mm = vma->vm_mm; -struct vm_area_struct *mpnt =NULL ; +struct vm_area_struct *mpnt;struct prio_tree_iter iter;unsigned long offset;pgoff_t pgoff;
@@ -145,8 +144,7 @@ make_coherent(struct vm_area_struct *vma* cache coherency. */ flush_dcache_mmap_lock (mapping); -while ((mpnt =vma_prio_tree_next (mpnt, &mapping->i_mmap, - &iter, pgoff, pgoff)) !=NULL ) { + vma_prio_tree_foreach(mpnt, &iter, &mapping->i_mmap, pgoff, pgoff) {/* * If this VMA is not in our MM, we can ignore it. * Note that we intentionally mask out the VMA
arch/parisc/kernel/cache.c +2 -3
@@ -231,7 +231,7 @@ void disable_sr_hashing(void)void __flush_dcache_page (struct page *page) {struct address_space *mapping =page_mapping (page); -struct vm_area_struct *mpnt =NULL ; +struct vm_area_struct *mpnt;struct prio_tree_iter iter;unsigned long offset;unsigned long addr;
@@ -250,8 +250,7 @@ void __flush_dcache_page(struct page *pa* to flush one address here for them all to become coherent */ flush_dcache_mmap_lock (mapping); -while ((mpnt =vma_prio_tree_next (mpnt, &mapping->i_mmap, - &iter, pgoff, pgoff)) !=NULL ) { + vma_prio_tree_foreach(mpnt, &iter, &mapping->i_mmap, pgoff, pgoff) { offset = (pgoff - mpnt->vm_pgoff) <<PAGE_SHIFT ; addr = mpnt->vm_start + offset;
fs/hugetlbfs/inode.c +2 -3
@@ -269,11 +269,10 @@ static void hugetlbfs_drop_inode(structstatic inline void hugetlb_vmtruncate_list (struct prio_tree_root *root,unsigned long h_pgoff) { -struct vm_area_struct *vma =NULL ; +struct vm_area_struct *vma;struct prio_tree_iter iter; -while ((vma =vma_prio_tree_next (vma, root, &iter, - h_pgoff,ULONG_MAX )) !=NULL ) { + vma_prio_tree_foreach(vma, &iter, root, h_pgoff, ULONG_MAX) {unsigned long h_vm_pgoff;unsigned long v_length;unsigned long v_offset;
include/linux/mm.h +6 -3
@@ -602,9 +602,12 @@ extern void si_meminfo_node(struct sysinvoid vma_prio_tree_add (struct vm_area_struct *,struct vm_area_struct *old);void vma_prio_tree_insert (struct vm_area_struct *,struct prio_tree_root *);void vma_prio_tree_remove (struct vm_area_struct *,struct prio_tree_root *); -struct vm_area_struct *vma_prio_tree_next ( -struct vm_area_struct *,struct prio_tree_root *, -struct prio_tree_iter *,pgoff_t begin,pgoff_t end); +struct vm_area_struct *vma_prio_tree_next (struct vm_area_struct *vma, +struct prio_tree_iter *iter); + +#define vma_prio_tree_foreach (vma, iter, root, begin, end) \ + for (prio_tree_iter_init(iter, root, begin, end), vma = NULL; \ + (vma = vma_prio_tree_next(vma, iter)); )static inline void vma_nonlinear_insert (struct vm_area_struct *vma,struct list_head *list)
include/linux/prio_tree.h +12 -0
@@ -17,8 +17,20 @@ struct prio_tree_iter {unsigned long mask;unsigned long value;int size_level; + +struct prio_tree_root *root; +pgoff_t r_index; +pgoff_t h_index; }; +static inline void prio_tree_iter_init (struct prio_tree_iter *iter, +struct prio_tree_root *root,pgoff_t r_index,pgoff_t h_index) +{ + iter->root = root; + iter->r_index = r_index; + iter->h_index = h_index; +} +#define INIT_PRIO_TREE_ROOT (ptr) \ do { \ (ptr)->prio_tree_node = NULL; \
mm/memory.c +3 -3
@@ -1123,12 +1123,12 @@ no_new_page:static inline void unmap_mapping_range_list (struct prio_tree_root *root,struct zap_details *details) { -struct vm_area_struct *vma =NULL ; +struct vm_area_struct *vma;struct prio_tree_iter iter;pgoff_t vba, vea, zba, zea; -while ((vma =vma_prio_tree_next (vma, root, &iter, - details->first_index, details->last_index)) !=NULL ) { +vma_prio_tree_foreach (vma, &iter, root, + details->first_index, details->last_index) { vba = vma->vm_pgoff; vea = vba + ((vma->vm_end - vma->vm_start) >>PAGE_SHIFT ) -1 ;/* Assume for now that PAGE_CACHE_SHIFT == PAGE_SHIFT */
mm/prio_tree.c +24 -36
170 lines not on this page · raw message
mm/rmap.c +4 -6
@@ -277,15 +277,14 @@ static inline int page_referenced_file(sunsigned int mapcount = page->mapcount;struct address_space *mapping = page->mapping;pgoff_t pgoff = page->index << (PAGE_CACHE_SHIFT -PAGE_SHIFT ); -struct vm_area_struct *vma =NULL ; +struct vm_area_struct *vma;struct prio_tree_iter iter;int referenced =0 ;if (!spin_trylock (&mapping->i_mmap_lock))return 0 ; -while ((vma =vma_prio_tree_next (vma, &mapping->i_mmap, - &iter, pgoff, pgoff)) !=NULL ) { + vma_prio_tree_foreach(vma, &iter, &mapping->i_mmap, pgoff, pgoff) {if ((vma->vm_flags & (VM_LOCKED |VM_MAYSHARE )) == (VM_LOCKED |VM_MAYSHARE )) { referenced++;
@@ -654,7 +653,7 @@ static inline int try_to_unmap_file(stru {struct address_space *mapping = page->mapping;pgoff_t pgoff = page->index << (PAGE_CACHE_SHIFT -PAGE_SHIFT ); -struct vm_area_struct *vma =NULL ; +struct vm_area_struct *vma;struct prio_tree_iter iter;int ret =SWAP_AGAIN ;unsigned long cursor;
@@ -665,8 +664,7 @@ static inline int try_to_unmap_file(struif (!spin_trylock (&mapping->i_mmap_lock))return ret; -while ((vma =vma_prio_tree_next (vma, &mapping->i_mmap, - &iter, pgoff, pgoff)) !=NULL ) { + vma_prio_tree_foreach(vma, &iter, &mapping->i_mmap, pgoff, pgoff) { ret =try_to_unmap_one (page, vma);if (ret ==SWAP_FAIL || !page->mapcount) goto out;