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