* [[PATCH -mm] 3/6] Fix the x86-64 page colouring code to take pgoff into account and use that code as the basis for a generic page colouring code. [not found] <1340029247-6949-1-git-send-email-riel@surriel.com> @ 2012-06-18 14:20 ` Rik van Riel 2012-06-18 14:20 ` [[PATCH -mm] 4/6] mm: remove x86 arch_get_unmapped_area(_topdown) Rik van Riel ` (2 subsequent siblings) 3 siblings, 0 replies; 5+ messages in thread From: Rik van Riel @ 2012-06-18 14:20 UTC (permalink / raw) To: linux-mm Cc: akpm, aarcange, peterz, minchan, kosaki.motohiro, andi, hnaz, mel, linux-kernel, knoel, Rik van Riel, Rik van Riel <<< No Message Collected >>> -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 5+ messages in thread
* [[PATCH -mm] 4/6] mm: remove x86 arch_get_unmapped_area(_topdown) [not found] <1340029247-6949-1-git-send-email-riel@surriel.com> 2012-06-18 14:20 ` [[PATCH -mm] 3/6] Fix the x86-64 page colouring code to take pgoff into account and use that code as the basis for a generic page colouring code Rik van Riel @ 2012-06-18 14:20 ` Rik van Riel 2012-06-18 14:20 ` [[PATCH -mm] 5/6] remove MIPS arch_get_unmapped_area code Rik van Riel 2012-06-18 14:20 ` [[PATCH -mm] 6/6] remove ARM arch_get_unmapped_area functions Rik van Riel 3 siblings, 0 replies; 5+ messages in thread From: Rik van Riel @ 2012-06-18 14:20 UTC (permalink / raw) To: linux-mm Cc: akpm, aarcange, peterz, minchan, kosaki.motohiro, andi, hnaz, mel, linux-kernel, knoel, Rik van Riel, Rik van Riel <<< No Message Collected >>> -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 5+ messages in thread
* [[PATCH -mm] 5/6] remove MIPS arch_get_unmapped_area code [not found] <1340029247-6949-1-git-send-email-riel@surriel.com> 2012-06-18 14:20 ` [[PATCH -mm] 3/6] Fix the x86-64 page colouring code to take pgoff into account and use that code as the basis for a generic page colouring code Rik van Riel 2012-06-18 14:20 ` [[PATCH -mm] 4/6] mm: remove x86 arch_get_unmapped_area(_topdown) Rik van Riel @ 2012-06-18 14:20 ` Rik van Riel 2012-06-18 14:20 ` [[PATCH -mm] 6/6] remove ARM arch_get_unmapped_area functions Rik van Riel 3 siblings, 0 replies; 5+ messages in thread From: Rik van Riel @ 2012-06-18 14:20 UTC (permalink / raw) To: linux-mm Cc: akpm, aarcange, peterz, minchan, kosaki.motohiro, andi, hnaz, mel, linux-kernel, knoel, Rik van Riel, Ralf Baechle, sjhill, Rik van Riel <<< No Message Collected >>> -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 5+ messages in thread
* [[PATCH -mm] 6/6] remove ARM arch_get_unmapped_area functions [not found] <1340029247-6949-1-git-send-email-riel@surriel.com> ` (2 preceding siblings ...) 2012-06-18 14:20 ` [[PATCH -mm] 5/6] remove MIPS arch_get_unmapped_area code Rik van Riel @ 2012-06-18 14:20 ` Rik van Riel 3 siblings, 0 replies; 5+ messages in thread From: Rik van Riel @ 2012-06-18 14:20 UTC (permalink / raw) To: linux-mm Cc: akpm, aarcange, peterz, minchan, kosaki.motohiro, andi, hnaz, mel, linux-kernel, knoel, Rik van Riel, Russell King, Rik van Riel <<< No Message Collected >>> -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH -mm 0/6] mm: scalable and unified arch_get_unmapped_area @ 2012-06-18 14:31 Rik van Riel 2012-06-18 14:31 ` [PATCH -mm 5/6] remove MIPS arch_get_unmapped_area code Rik van Riel 0 siblings, 1 reply; 5+ messages in thread From: Rik van Riel @ 2012-06-18 14:31 UTC (permalink / raw) To: linux-mm Cc: akpm, aarcange, peterz, minchan, kosaki.motohiro, andi, hnaz, mel, linux-kernel A long time ago, we decided to limit the number of VMAs per process to 64k. As it turns out, there actually are programs using tens of thousands of VMAs. The linear search in arch_get_unmapped_area and arch_get_unmapped_area_topdown can be a real issue for those programs. This patch series aims to fix the scalability issue by tracking the size of each free hole in the VMA rbtree, propagating the free hole info up the tree. Another major goal is to put the bulk of the necessary arch_get_unmapped_area(_topdown) functionality into one set of functions, so we can eliminate the custom large functions per architecture, sticking to a few much smaller architecture specific functions instead. In this version I have only gotten rid of the x86, ARM and MIPS arch-specific code, and am already showing a fairly promising diffstat: arch/arm/include/asm/pgtable.h | 6 arch/arm/mm/init.c | 3 arch/arm/mm/mmap.c | 217 ------------------ arch/mips/include/asm/page.h | 2 arch/mips/include/asm/pgtable.h | 7 arch/mips/mm/mmap.c | 177 -------------- arch/x86/include/asm/elf.h | 3 arch/x86/include/asm/pgtable_64.h | 4 arch/x86/kernel/sys_x86_64.c | 200 ++-------------- arch/x86/vdso/vma.c | 2 include/linux/mm_types.h | 8 include/linux/sched.h | 13 + mm/internal.h | 5 mm/mmap.c | 455 ++++++++++++++++++++++++++++++-------- 14 files changed, 420 insertions(+), 682 deletions(-) TODO: - eliminate arch-specific functions for more architectures - integrate hugetlbfs alignment (with Andi Kleen's patch?) Performance Testing performance with a benchmark that allocates tens of thousands of VMAs, unmaps them and mmaps them some more in a loop, shows promising results. Vanilla 3.4 kernel: $ ./agua_frag_test_64 .......... Min Time (ms): 6 Avg. Time (ms): 294.0000 Max Time (ms): 609 Std Dev (ms): 113.1664 Standard deviation exceeds 10 With patches: $ ./agua_frag_test_64 .......... Min Time (ms): 14 Avg. Time (ms): 38.0000 Max Time (ms): 60 Std Dev (ms): 3.9312 All checks pass The total run time of the test goes down by about a factor 4. More importantly, the worst case performance of the loop (which is what really hurt some applications) has gone down by about a factor 10. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH -mm 5/6] remove MIPS arch_get_unmapped_area code 2012-06-18 14:31 [PATCH -mm 0/6] mm: scalable and unified arch_get_unmapped_area Rik van Riel @ 2012-06-18 14:31 ` Rik van Riel 0 siblings, 0 replies; 5+ messages in thread From: Rik van Riel @ 2012-06-18 14:31 UTC (permalink / raw) To: linux-mm Cc: akpm, aarcange, peterz, minchan, kosaki.motohiro, andi, hnaz, mel, linux-kernel, Rik van Riel, Ralf Baechle, sjhill, Rik van Riel From: Rik van Riel <riel@surriel.com> Remove all the MIPS specific arch_get_unmapped_area(_topdown) and page colouring code, now that the generic code should be able to handle things. Untested, because I do not have any MIPS systems. Cc: Ralf Baechle <ralf@linux-mips.org> Cc: sjhill@mips.com Signed-off-by: Rik van Riel <riel@redhat.com> --- arch/mips/include/asm/pgtable.h | 8 -- arch/mips/mm/mmap.c | 175 --------------------------------------- 2 files changed, 0 insertions(+), 183 deletions(-) diff --git a/arch/mips/include/asm/pgtable.h b/arch/mips/include/asm/pgtable.h index f133a4c..5f9c49a 100644 --- a/arch/mips/include/asm/pgtable.h +++ b/arch/mips/include/asm/pgtable.h @@ -410,14 +410,6 @@ int phys_mem_access_prot_allowed(struct file *file, unsigned long pfn, #endif /* - * We provide our own get_unmapped area to cope with the virtual aliasing - * constraints placed on us by the cache architecture. - */ -#define HAVE_ARCH_UNMAPPED_AREA -#define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN -#define HAVE_ARCH_ALIGN_ADDR - -/* * No page table caches to initialise */ #define pgtable_cache_init() do { } while (0) diff --git a/arch/mips/mm/mmap.c b/arch/mips/mm/mmap.c index 3f8af17..ac342bd 100644 --- a/arch/mips/mm/mmap.c +++ b/arch/mips/mm/mmap.c @@ -15,9 +15,6 @@ #include <linux/random.h> #include <linux/sched.h> -unsigned long shm_align_mask = PAGE_SIZE - 1; /* Sane caches */ -EXPORT_SYMBOL(shm_align_mask); - /* gap between mmap and stack */ #define MIN_GAP (128*1024*1024UL) #define MAX_GAP ((TASK_SIZE)/6*5) @@ -45,178 +42,6 @@ static unsigned long mmap_base(unsigned long rnd) return PAGE_ALIGN(TASK_SIZE - gap - rnd); } -static inline unsigned long COLOUR_ALIGN_DOWN(unsigned long addr, - unsigned long pgoff) -{ - unsigned long base = addr & ~shm_align_mask; - unsigned long off = (pgoff << PAGE_SHIFT) & shm_align_mask; - - if (base + off <= addr) - return base + off; - - return base - off; -} - -#define COLOUR_ALIGN(addr, pgoff) \ - ((((addr) + shm_align_mask) & ~shm_align_mask) + \ - (((pgoff) << PAGE_SHIFT) & shm_align_mask)) - -static unsigned long arch_get_unmapped_area_common(struct file *filp, - unsigned long addr0, unsigned long len, unsigned long pgoff, - unsigned long flags, enum mmap_allocation_direction dir) -{ - struct mm_struct *mm = current->mm; - struct vm_area_struct *vma; - unsigned long addr = addr0; - int do_color_align; - - if (unlikely(len > TASK_SIZE)) - return -ENOMEM; - - if (flags & MAP_FIXED) { - /* Even MAP_FIXED mappings must reside within TASK_SIZE */ - if (TASK_SIZE - len < addr) - return -EINVAL; - - /* - * We do not accept a shared mapping if it would violate - * cache aliasing constraints. - */ - if ((flags & MAP_SHARED) && - ((addr - (pgoff << PAGE_SHIFT)) & shm_align_mask)) - return -EINVAL; - return addr; - } - - do_color_align = 0; - if (filp || (flags & MAP_SHARED)) - do_color_align = 1; - - /* requesting a specific address */ - if (addr) { - if (do_color_align) - addr = COLOUR_ALIGN(addr, pgoff); - else - addr = PAGE_ALIGN(addr); - - vma = find_vma(mm, addr); - if (TASK_SIZE - len >= addr && - (!vma || addr + len <= vma->vm_start)) - return addr; - } - - if (dir == ALLOC_UP) { - addr = mm->mmap_base; - if (do_color_align) - addr = COLOUR_ALIGN(addr, pgoff); - else - addr = PAGE_ALIGN(addr); - - for (vma = find_vma(current->mm, addr); ; vma = vma->vm_next) { - /* At this point: (!vma || addr < vma->vm_end). */ - if (TASK_SIZE - len < addr) - return -ENOMEM; - if (!vma || addr + len <= vma->vm_start) - return addr; - addr = vma->vm_end; - if (do_color_align) - addr = COLOUR_ALIGN(addr, pgoff); - } - } else { - /* check if free_area_cache is useful for us */ - if (len <= mm->cached_hole_size) { - mm->cached_hole_size = 0; - mm->free_area_cache = mm->mmap_base; - } - - /* - * either no address requested, or the mapping can't fit into - * the requested address hole - */ - addr = mm->free_area_cache; - if (do_color_align) { - unsigned long base = - COLOUR_ALIGN_DOWN(addr - len, pgoff); - addr = base + len; - } - - /* make sure it can fit in the remaining address space */ - if (likely(addr > len)) { - vma = find_vma(mm, addr - len); - if (!vma || addr <= vma->vm_start) { - /* cache the address as a hint for next time */ - return mm->free_area_cache = addr - len; - } - } - - if (unlikely(mm->mmap_base < len)) - goto bottomup; - - addr = mm->mmap_base - len; - if (do_color_align) - addr = COLOUR_ALIGN_DOWN(addr, pgoff); - - do { - /* - * Lookup failure means no vma is above this address, - * else if new region fits below vma->vm_start, - * return with success: - */ - vma = find_vma(mm, addr); - if (likely(!vma || addr + len <= vma->vm_start)) { - /* cache the address as a hint for next time */ - return mm->free_area_cache = addr; - } - - /* remember the largest hole we saw so far */ - if (addr + mm->cached_hole_size < vma->vm_start) - mm->cached_hole_size = vma->vm_start - addr; - - /* try just below the current vma->vm_start */ - addr = vma->vm_start - len; - if (do_color_align) - addr = COLOUR_ALIGN_DOWN(addr, pgoff); - } while (likely(len < vma->vm_start)); - -bottomup: - /* - * A failed mmap() very likely causes application failure, - * so fall back to the bottom-up function here. This scenario - * can happen with large stack limits and large mmap() - * allocations. - */ - mm->cached_hole_size = ~0UL; - mm->free_area_cache = TASK_UNMAPPED_BASE; - addr = arch_get_unmapped_area(filp, addr0, len, pgoff, flags); - /* - * Restore the topdown base: - */ - mm->free_area_cache = mm->mmap_base; - mm->cached_hole_size = ~0UL; - - return addr; - } -} - -unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr0, - unsigned long len, unsigned long pgoff, unsigned long flags) -{ - return arch_get_unmapped_area_common(filp, - addr0, len, pgoff, flags, ALLOC_UP); -} - -/* - * There is no need to export this but sched.h declares the function as - * extern so making it static here results in an error. - */ -unsigned long arch_get_unmapped_area_topdown(struct file *filp, - unsigned long addr0, unsigned long len, unsigned long pgoff, - unsigned long flags) -{ - return arch_get_unmapped_area_common(filp, - addr0, len, pgoff, flags, ALLOC_DOWN); -} - void arch_pick_mmap_layout(struct mm_struct *mm) { unsigned long random_factor = 0UL; -- 1.7.7.6 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2012-06-18 14:32 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- [not found] <1340029247-6949-1-git-send-email-riel@surriel.com> 2012-06-18 14:20 ` [[PATCH -mm] 3/6] Fix the x86-64 page colouring code to take pgoff into account and use that code as the basis for a generic page colouring code Rik van Riel 2012-06-18 14:20 ` [[PATCH -mm] 4/6] mm: remove x86 arch_get_unmapped_area(_topdown) Rik van Riel 2012-06-18 14:20 ` [[PATCH -mm] 5/6] remove MIPS arch_get_unmapped_area code Rik van Riel 2012-06-18 14:20 ` [[PATCH -mm] 6/6] remove ARM arch_get_unmapped_area functions Rik van Riel 2012-06-18 14:31 [PATCH -mm 0/6] mm: scalable and unified arch_get_unmapped_area Rik van Riel 2012-06-18 14:31 ` [PATCH -mm 5/6] remove MIPS arch_get_unmapped_area code Rik van Riel
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).