diff options
author | Ingo Molnar <mingo@kernel.org> | 2012-05-14 08:43:40 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2012-05-14 08:43:40 -0400 |
commit | 9cba26e66d09bf394ae5a739627a1dc8b7cae6f4 (patch) | |
tree | f03743d576a0c7826b9921ad47e70370ebe80a22 /mm/mmap.c | |
parent | ec83db0f78cd44c3b586ec1c3a348d1a8a389797 (diff) | |
parent | 73eff9f56e15598c8399c0b86899fd889b97f085 (diff) |
Merge branch 'perf/uprobes' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/uprobes
Diffstat (limited to 'mm/mmap.c')
-rw-r--r-- | mm/mmap.c | 59 |
1 files changed, 50 insertions, 9 deletions
@@ -241,6 +241,8 @@ static struct vm_area_struct *remove_vma(struct vm_area_struct *vma) | |||
241 | return next; | 241 | return next; |
242 | } | 242 | } |
243 | 243 | ||
244 | static unsigned long do_brk(unsigned long addr, unsigned long len); | ||
245 | |||
244 | SYSCALL_DEFINE1(brk, unsigned long, brk) | 246 | SYSCALL_DEFINE1(brk, unsigned long, brk) |
245 | { | 247 | { |
246 | unsigned long rlim, retval; | 248 | unsigned long rlim, retval; |
@@ -969,7 +971,7 @@ static inline unsigned long round_hint_to_min(unsigned long hint) | |||
969 | * The caller must hold down_write(¤t->mm->mmap_sem). | 971 | * The caller must hold down_write(¤t->mm->mmap_sem). |
970 | */ | 972 | */ |
971 | 973 | ||
972 | unsigned long do_mmap_pgoff(struct file *file, unsigned long addr, | 974 | static unsigned long do_mmap_pgoff(struct file *file, unsigned long addr, |
973 | unsigned long len, unsigned long prot, | 975 | unsigned long len, unsigned long prot, |
974 | unsigned long flags, unsigned long pgoff) | 976 | unsigned long flags, unsigned long pgoff) |
975 | { | 977 | { |
@@ -1105,7 +1107,32 @@ unsigned long do_mmap_pgoff(struct file *file, unsigned long addr, | |||
1105 | 1107 | ||
1106 | return mmap_region(file, addr, len, flags, vm_flags, pgoff); | 1108 | return mmap_region(file, addr, len, flags, vm_flags, pgoff); |
1107 | } | 1109 | } |
1108 | EXPORT_SYMBOL(do_mmap_pgoff); | 1110 | |
1111 | unsigned long do_mmap(struct file *file, unsigned long addr, | ||
1112 | unsigned long len, unsigned long prot, | ||
1113 | unsigned long flag, unsigned long offset) | ||
1114 | { | ||
1115 | if (unlikely(offset + PAGE_ALIGN(len) < offset)) | ||
1116 | return -EINVAL; | ||
1117 | if (unlikely(offset & ~PAGE_MASK)) | ||
1118 | return -EINVAL; | ||
1119 | return do_mmap_pgoff(file, addr, len, prot, flag, offset >> PAGE_SHIFT); | ||
1120 | } | ||
1121 | EXPORT_SYMBOL(do_mmap); | ||
1122 | |||
1123 | unsigned long vm_mmap(struct file *file, unsigned long addr, | ||
1124 | unsigned long len, unsigned long prot, | ||
1125 | unsigned long flag, unsigned long offset) | ||
1126 | { | ||
1127 | unsigned long ret; | ||
1128 | struct mm_struct *mm = current->mm; | ||
1129 | |||
1130 | down_write(&mm->mmap_sem); | ||
1131 | ret = do_mmap(file, addr, len, prot, flag, offset); | ||
1132 | up_write(&mm->mmap_sem); | ||
1133 | return ret; | ||
1134 | } | ||
1135 | EXPORT_SYMBOL(vm_mmap); | ||
1109 | 1136 | ||
1110 | SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned long, len, | 1137 | SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned long, len, |
1111 | unsigned long, prot, unsigned long, flags, | 1138 | unsigned long, prot, unsigned long, flags, |
@@ -2128,21 +2155,25 @@ int do_munmap(struct mm_struct *mm, unsigned long start, size_t len) | |||
2128 | 2155 | ||
2129 | return 0; | 2156 | return 0; |
2130 | } | 2157 | } |
2131 | |||
2132 | EXPORT_SYMBOL(do_munmap); | 2158 | EXPORT_SYMBOL(do_munmap); |
2133 | 2159 | ||
2134 | SYSCALL_DEFINE2(munmap, unsigned long, addr, size_t, len) | 2160 | int vm_munmap(unsigned long start, size_t len) |
2135 | { | 2161 | { |
2136 | int ret; | 2162 | int ret; |
2137 | struct mm_struct *mm = current->mm; | 2163 | struct mm_struct *mm = current->mm; |
2138 | 2164 | ||
2139 | profile_munmap(addr); | ||
2140 | |||
2141 | down_write(&mm->mmap_sem); | 2165 | down_write(&mm->mmap_sem); |
2142 | ret = do_munmap(mm, addr, len); | 2166 | ret = do_munmap(mm, start, len); |
2143 | up_write(&mm->mmap_sem); | 2167 | up_write(&mm->mmap_sem); |
2144 | return ret; | 2168 | return ret; |
2145 | } | 2169 | } |
2170 | EXPORT_SYMBOL(vm_munmap); | ||
2171 | |||
2172 | SYSCALL_DEFINE2(munmap, unsigned long, addr, size_t, len) | ||
2173 | { | ||
2174 | profile_munmap(addr); | ||
2175 | return vm_munmap(addr, len); | ||
2176 | } | ||
2146 | 2177 | ||
2147 | static inline void verify_mm_writelocked(struct mm_struct *mm) | 2178 | static inline void verify_mm_writelocked(struct mm_struct *mm) |
2148 | { | 2179 | { |
@@ -2159,7 +2190,7 @@ static inline void verify_mm_writelocked(struct mm_struct *mm) | |||
2159 | * anonymous maps. eventually we may be able to do some | 2190 | * anonymous maps. eventually we may be able to do some |
2160 | * brk-specific accounting here. | 2191 | * brk-specific accounting here. |
2161 | */ | 2192 | */ |
2162 | unsigned long do_brk(unsigned long addr, unsigned long len) | 2193 | static unsigned long do_brk(unsigned long addr, unsigned long len) |
2163 | { | 2194 | { |
2164 | struct mm_struct * mm = current->mm; | 2195 | struct mm_struct * mm = current->mm; |
2165 | struct vm_area_struct * vma, * prev; | 2196 | struct vm_area_struct * vma, * prev; |
@@ -2255,7 +2286,17 @@ out: | |||
2255 | return addr; | 2286 | return addr; |
2256 | } | 2287 | } |
2257 | 2288 | ||
2258 | EXPORT_SYMBOL(do_brk); | 2289 | unsigned long vm_brk(unsigned long addr, unsigned long len) |
2290 | { | ||
2291 | struct mm_struct *mm = current->mm; | ||
2292 | unsigned long ret; | ||
2293 | |||
2294 | down_write(&mm->mmap_sem); | ||
2295 | ret = do_brk(addr, len); | ||
2296 | up_write(&mm->mmap_sem); | ||
2297 | return ret; | ||
2298 | } | ||
2299 | EXPORT_SYMBOL(vm_brk); | ||
2259 | 2300 | ||
2260 | /* Release all mmaps. */ | 2301 | /* Release all mmaps. */ |
2261 | void exit_mmap(struct mm_struct *mm) | 2302 | void exit_mmap(struct mm_struct *mm) |