* [[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 4/6] mm: remove x86 arch_get_unmapped_area(_topdown) 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 4/6] mm: remove x86 arch_get_unmapped_area(_topdown) 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, Rik van Riel From: Rik van Riel <riel@surriel.com> The generic arch_get_unmapped_area(_topdown) should now be able to do everything x86 needs. Remove the x86 specific functions. TODO: make the hugetlbfs arch_get_unmapped_area call the generic code with proper alignment info. Cc: Andi Kleen <andi@firstfloor.org> Signed-off-by: Rik van Riel <riel@redhat.com> --- arch/x86/include/asm/pgtable_64.h | 2 - arch/x86/kernel/sys_x86_64.c | 162 ------------------------------------- 2 files changed, 0 insertions(+), 164 deletions(-) diff --git a/arch/x86/include/asm/pgtable_64.h b/arch/x86/include/asm/pgtable_64.h index 8408ccd..0ff6500 100644 --- a/arch/x86/include/asm/pgtable_64.h +++ b/arch/x86/include/asm/pgtable_64.h @@ -167,8 +167,6 @@ static inline int pgd_large(pgd_t pgd) { return 0; } extern int kern_addr_valid(unsigned long addr); extern void cleanup_highmap(void); -#define HAVE_ARCH_UNMAPPED_AREA -#define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN #define HAVE_ARCH_GET_ADDRESS_RANGE #define HAVE_ARCH_ALIGN_ADDR diff --git a/arch/x86/kernel/sys_x86_64.c b/arch/x86/kernel/sys_x86_64.c index ac0afb8..0243c58 100644 --- a/arch/x86/kernel/sys_x86_64.c +++ b/arch/x86/kernel/sys_x86_64.c @@ -131,165 +131,3 @@ void arch_get_address_range(unsigned long flags, unsigned long *begin, *end = current->mm->mmap_base; } } - -unsigned long -arch_get_unmapped_area(struct file *filp, unsigned long addr, - unsigned long len, unsigned long pgoff, unsigned long flags) -{ - struct mm_struct *mm = current->mm; - struct vm_area_struct *vma; - unsigned long start_addr; - unsigned long begin, end; - - if (flags & MAP_FIXED) - return addr; - - arch_get_address_range(flags, &begin, &end, ALLOC_UP); - - if (len > end) - return -ENOMEM; - - if (addr) { - addr = PAGE_ALIGN(addr); - vma = find_vma(mm, addr); - if (end - len >= addr && - (!vma || addr + len <= vma->vm_start)) - return addr; - } - if (((flags & MAP_32BIT) || test_thread_flag(TIF_ADDR32)) - && len <= mm->cached_hole_size) { - mm->cached_hole_size = 0; - mm->free_area_cache = begin; - } - addr = mm->free_area_cache; - if (addr < begin) - addr = begin; - start_addr = addr; - -full_search: - - addr = arch_align_addr(addr, filp, pgoff, flags, ALLOC_UP); - - for (vma = find_vma(mm, addr); ; vma = vma->vm_next) { - /* At this point: (!vma || addr < vma->vm_end). */ - if (end - len < addr) { - /* - * Start a new search - just in case we missed - * some holes. - */ - if (start_addr != begin) { - start_addr = addr = begin; - mm->cached_hole_size = 0; - goto full_search; - } - return -ENOMEM; - } - if (!vma || addr + len <= vma->vm_start) { - /* - * Remember the place where we stopped the search: - */ - mm->free_area_cache = addr + len; - return addr; - } - if (addr + mm->cached_hole_size < vma->vm_start) - mm->cached_hole_size = vma->vm_start - addr; - - addr = vma->vm_end; - addr = arch_align_addr(addr, filp, pgoff, flags, ALLOC_UP); - } -} - - -unsigned long -arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, - const unsigned long len, const unsigned long pgoff, - const unsigned long flags) -{ - struct vm_area_struct *vma; - struct mm_struct *mm = current->mm; - unsigned long addr = addr0, start_addr; - - /* requested length too big for entire address space */ - if (len > TASK_SIZE) - return -ENOMEM; - - if (flags & MAP_FIXED) - return addr; - - /* for MAP_32BIT mappings we force the legact mmap base */ - if (!test_thread_flag(TIF_ADDR32) && (flags & MAP_32BIT)) - goto bottomup; - - /* requesting a specific address */ - if (addr) { - addr = PAGE_ALIGN(addr); - vma = find_vma(mm, addr); - if (TASK_SIZE - len >= addr && - (!vma || addr + len <= vma->vm_start)) - return addr; - } - - /* 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; - } - -try_again: - /* either no address requested or can't fit in requested address hole */ - start_addr = addr = mm->free_area_cache; - - if (addr < len) - goto fail; - - addr -= len; - do { - addr = arch_align_addr(addr, filp, pgoff, flags, ALLOC_DOWN); - - /* - * 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 (!vma || addr+len <= vma->vm_start) - /* remember 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; - } while (len < vma->vm_start); - -fail: - /* - * if hint left us with no space for the requested - * mapping then try again: - */ - if (start_addr != mm->mmap_base) { - mm->free_area_cache = mm->mmap_base; - mm->cached_hole_size = 0; - goto try_again; - } - -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; -} -- 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 4/6] mm: remove x86 arch_get_unmapped_area(_topdown) 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).