aboutsummaryrefslogtreecommitdiffstats
path: root/mm/mmap.c
diff options
context:
space:
mode:
authorIngo Molnar <mingo@kernel.org>2012-05-14 08:43:40 -0400
committerIngo Molnar <mingo@kernel.org>2012-05-14 08:43:40 -0400
commit9cba26e66d09bf394ae5a739627a1dc8b7cae6f4 (patch)
treef03743d576a0c7826b9921ad47e70370ebe80a22 /mm/mmap.c
parentec83db0f78cd44c3b586ec1c3a348d1a8a389797 (diff)
parent73eff9f56e15598c8399c0b86899fd889b97f085 (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.c59
1 files changed, 50 insertions, 9 deletions
diff --git a/mm/mmap.c b/mm/mmap.c
index 15c21a15040..b8c4072dd9c 100644
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -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
244static unsigned long do_brk(unsigned long addr, unsigned long len);
245
244SYSCALL_DEFINE1(brk, unsigned long, brk) 246SYSCALL_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(&current->mm->mmap_sem). 971 * The caller must hold down_write(&current->mm->mmap_sem).
970 */ 972 */
971 973
972unsigned long do_mmap_pgoff(struct file *file, unsigned long addr, 974static 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}
1108EXPORT_SYMBOL(do_mmap_pgoff); 1110
1111unsigned 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}
1121EXPORT_SYMBOL(do_mmap);
1122
1123unsigned 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}
1135EXPORT_SYMBOL(vm_mmap);
1109 1136
1110SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned long, len, 1137SYSCALL_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
2132EXPORT_SYMBOL(do_munmap); 2158EXPORT_SYMBOL(do_munmap);
2133 2159
2134SYSCALL_DEFINE2(munmap, unsigned long, addr, size_t, len) 2160int 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}
2170EXPORT_SYMBOL(vm_munmap);
2171
2172SYSCALL_DEFINE2(munmap, unsigned long, addr, size_t, len)
2173{
2174 profile_munmap(addr);
2175 return vm_munmap(addr, len);
2176}
2146 2177
2147static inline void verify_mm_writelocked(struct mm_struct *mm) 2178static 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 */
2162unsigned long do_brk(unsigned long addr, unsigned long len) 2193static 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
2258EXPORT_SYMBOL(do_brk); 2289unsigned 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}
2299EXPORT_SYMBOL(vm_brk);
2259 2300
2260/* Release all mmaps. */ 2301/* Release all mmaps. */
2261void exit_mmap(struct mm_struct *mm) 2302void exit_mmap(struct mm_struct *mm)