mmap.c (1da177e4c3f41524e886b7f1b8a0c1fc7321cac2) | mmap.c (1363c3cd8603a913a27e2995dccbd70d5312d8e6) |
---|---|
1/* 2 * linux/arch/arm/mm/mmap.c 3 */ 4#include <linux/config.h> 5#include <linux/fs.h> 6#include <linux/mm.h> 7#include <linux/mman.h> 8#include <linux/shm.h> --- 59 unchanged lines hidden (view full) --- 68 else 69 addr = PAGE_ALIGN(addr); 70 71 vma = find_vma(mm, addr); 72 if (TASK_SIZE - len >= addr && 73 (!vma || addr + len <= vma->vm_start)) 74 return addr; 75 } | 1/* 2 * linux/arch/arm/mm/mmap.c 3 */ 4#include <linux/config.h> 5#include <linux/fs.h> 6#include <linux/mm.h> 7#include <linux/mman.h> 8#include <linux/shm.h> --- 59 unchanged lines hidden (view full) --- 68 else 69 addr = PAGE_ALIGN(addr); 70 71 vma = find_vma(mm, addr); 72 if (TASK_SIZE - len >= addr && 73 (!vma || addr + len <= vma->vm_start)) 74 return addr; 75 } |
76 start_addr = addr = mm->free_area_cache; | 76 if (len > mm->cached_hole_size) { 77 start_addr = addr = mm->free_area_cache; 78 } else { 79 start_addr = addr = TASK_UNMAPPED_BASE; 80 mm->cached_hole_size = 0; 81 } |
77 78full_search: 79 if (do_align) 80 addr = COLOUR_ALIGN(addr, pgoff); 81 else 82 addr = PAGE_ALIGN(addr); 83 84 for (vma = find_vma(mm, addr); ; vma = vma->vm_next) { 85 /* At this point: (!vma || addr < vma->vm_end). */ 86 if (TASK_SIZE - len < addr) { 87 /* 88 * Start a new search - just in case we missed 89 * some holes. 90 */ 91 if (start_addr != TASK_UNMAPPED_BASE) { 92 start_addr = addr = TASK_UNMAPPED_BASE; | 82 83full_search: 84 if (do_align) 85 addr = COLOUR_ALIGN(addr, pgoff); 86 else 87 addr = PAGE_ALIGN(addr); 88 89 for (vma = find_vma(mm, addr); ; vma = vma->vm_next) { 90 /* At this point: (!vma || addr < vma->vm_end). */ 91 if (TASK_SIZE - len < addr) { 92 /* 93 * Start a new search - just in case we missed 94 * some holes. 95 */ 96 if (start_addr != TASK_UNMAPPED_BASE) { 97 start_addr = addr = TASK_UNMAPPED_BASE; |
98 mm->cached_hole_size = 0; |
|
93 goto full_search; 94 } 95 return -ENOMEM; 96 } 97 if (!vma || addr + len <= vma->vm_start) { 98 /* 99 * Remember the place where we stopped the search: 100 */ 101 mm->free_area_cache = addr + len; 102 return addr; 103 } | 99 goto full_search; 100 } 101 return -ENOMEM; 102 } 103 if (!vma || addr + len <= vma->vm_start) { 104 /* 105 * Remember the place where we stopped the search: 106 */ 107 mm->free_area_cache = addr + len; 108 return addr; 109 } |
110 if (addr + mm->cached_hole_size < vma->vm_start) 111 mm->cached_hole_size = vma->vm_start - addr; |
|
104 addr = vma->vm_end; 105 if (do_align) 106 addr = COLOUR_ALIGN(addr, pgoff); 107 } 108} 109 | 112 addr = vma->vm_end; 113 if (do_align) 114 addr = COLOUR_ALIGN(addr, pgoff); 115 } 116} 117 |