Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

VM: add "vm_brk()" helper function

It does the same thing as "do_brk()", except it handles the VM locking
too.

It turns out that all external callers want that anyway, so we can make
do_brk() static to just mm/mmap.c while at it.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

+31 -45
+5 -15
arch/x86/ia32/ia32_aout.c
··· 119 119 end = PAGE_ALIGN(end); 120 120 if (end <= start) 121 121 return; 122 - down_write(&current->mm->mmap_sem); 123 - do_brk(start, end - start); 124 - up_write(&current->mm->mmap_sem); 122 + vm_brk(start, end - start); 125 123 } 126 124 127 125 #ifdef CORE_DUMP ··· 330 332 pos = 32; 331 333 map_size = ex.a_text+ex.a_data; 332 334 333 - down_write(&current->mm->mmap_sem); 334 - error = do_brk(text_addr & PAGE_MASK, map_size); 335 - up_write(&current->mm->mmap_sem); 335 + error = vm_brk(text_addr & PAGE_MASK, map_size); 336 336 337 337 if (error != (text_addr & PAGE_MASK)) { 338 338 send_sig(SIGKILL, current, 0); ··· 369 373 if (!bprm->file->f_op->mmap || (fd_offset & ~PAGE_MASK) != 0) { 370 374 loff_t pos = fd_offset; 371 375 372 - down_write(&current->mm->mmap_sem); 373 - do_brk(N_TXTADDR(ex), ex.a_text+ex.a_data); 374 - up_write(&current->mm->mmap_sem); 376 + vm_brk(N_TXTADDR(ex), ex.a_text+ex.a_data); 375 377 bprm->file->f_op->read(bprm->file, 376 378 (char __user *)N_TXTADDR(ex), 377 379 ex.a_text+ex.a_data, &pos); ··· 470 476 error_time = jiffies; 471 477 } 472 478 #endif 473 - down_write(&current->mm->mmap_sem); 474 - do_brk(start_addr, ex.a_text + ex.a_data + ex.a_bss); 475 - up_write(&current->mm->mmap_sem); 479 + vm_brk(start_addr, ex.a_text + ex.a_data + ex.a_bss); 476 480 477 481 file->f_op->read(file, (char __user *)start_addr, 478 482 ex.a_text + ex.a_data, &pos); ··· 495 503 len = PAGE_ALIGN(ex.a_text + ex.a_data); 496 504 bss = ex.a_text + ex.a_data + ex.a_bss; 497 505 if (bss > len) { 498 - down_write(&current->mm->mmap_sem); 499 - error = do_brk(start_addr + len, bss - len); 500 - up_write(&current->mm->mmap_sem); 506 + error = vm_brk(start_addr + len, bss - len); 501 507 retval = error; 502 508 if (error != start_addr + len) 503 509 goto out;
+5 -15
fs/binfmt_aout.c
··· 50 50 end = PAGE_ALIGN(end); 51 51 if (end > start) { 52 52 unsigned long addr; 53 - down_write(&current->mm->mmap_sem); 54 - addr = do_brk(start, end - start); 55 - up_write(&current->mm->mmap_sem); 53 + addr = vm_brk(start, end - start); 56 54 if (BAD_ADDR(addr)) 57 55 return addr; 58 56 } ··· 278 280 pos = 32; 279 281 map_size = ex.a_text+ex.a_data; 280 282 #endif 281 - down_write(&current->mm->mmap_sem); 282 - error = do_brk(text_addr & PAGE_MASK, map_size); 283 - up_write(&current->mm->mmap_sem); 283 + error = vm_brk(text_addr & PAGE_MASK, map_size); 284 284 if (error != (text_addr & PAGE_MASK)) { 285 285 send_sig(SIGKILL, current, 0); 286 286 return error; ··· 309 313 310 314 if (!bprm->file->f_op->mmap||((fd_offset & ~PAGE_MASK) != 0)) { 311 315 loff_t pos = fd_offset; 312 - down_write(&current->mm->mmap_sem); 313 - do_brk(N_TXTADDR(ex), ex.a_text+ex.a_data); 314 - up_write(&current->mm->mmap_sem); 316 + vm_brk(N_TXTADDR(ex), ex.a_text+ex.a_data); 315 317 bprm->file->f_op->read(bprm->file, 316 318 (char __user *)N_TXTADDR(ex), 317 319 ex.a_text+ex.a_data, &pos); ··· 406 412 "N_TXTOFF is not page aligned. Please convert library: %s\n", 407 413 file->f_path.dentry->d_name.name); 408 414 } 409 - down_write(&current->mm->mmap_sem); 410 - do_brk(start_addr, ex.a_text + ex.a_data + ex.a_bss); 411 - up_write(&current->mm->mmap_sem); 415 + vm_brk(start_addr, ex.a_text + ex.a_data + ex.a_bss); 412 416 413 417 file->f_op->read(file, (char __user *)start_addr, 414 418 ex.a_text + ex.a_data, &pos); ··· 430 438 len = PAGE_ALIGN(ex.a_text + ex.a_data); 431 439 bss = ex.a_text + ex.a_data + ex.a_bss; 432 440 if (bss > len) { 433 - down_write(&current->mm->mmap_sem); 434 - error = do_brk(start_addr + len, bss - len); 435 - up_write(&current->mm->mmap_sem); 441 + error = vm_brk(start_addr + len, bss - len); 436 442 retval = error; 437 443 if (error != start_addr + len) 438 444 goto out;
+4 -11
fs/binfmt_elf.c
··· 82 82 end = ELF_PAGEALIGN(end); 83 83 if (end > start) { 84 84 unsigned long addr; 85 - down_write(&current->mm->mmap_sem); 86 - addr = do_brk(start, end - start); 87 - up_write(&current->mm->mmap_sem); 85 + addr = vm_brk(start, end - start); 88 86 if (BAD_ADDR(addr)) 89 87 return addr; 90 88 } ··· 512 514 elf_bss = ELF_PAGESTART(elf_bss + ELF_MIN_ALIGN - 1); 513 515 514 516 /* Map the last of the bss segment */ 515 - down_write(&current->mm->mmap_sem); 516 - error = do_brk(elf_bss, last_bss - elf_bss); 517 - up_write(&current->mm->mmap_sem); 517 + error = vm_brk(elf_bss, last_bss - elf_bss); 518 518 if (BAD_ADDR(error)) 519 519 goto out_close; 520 520 } ··· 1068 1072 len = ELF_PAGESTART(eppnt->p_filesz + eppnt->p_vaddr + 1069 1073 ELF_MIN_ALIGN - 1); 1070 1074 bss = eppnt->p_memsz + eppnt->p_vaddr; 1071 - if (bss > len) { 1072 - down_write(&current->mm->mmap_sem); 1073 - do_brk(len, bss - len); 1074 - up_write(&current->mm->mmap_sem); 1075 - } 1075 + if (bss > len) 1076 + vm_brk(len, bss - len); 1076 1077 error = 0; 1077 1078 1078 1079 out_free_ph:
+2 -1
include/linux/mm.h
··· 1415 1415 1416 1416 extern int do_munmap(struct mm_struct *, unsigned long, size_t); 1417 1417 1418 - extern unsigned long do_brk(unsigned long, unsigned long); 1418 + /* These take the mm semaphore themselves */ 1419 + extern unsigned long vm_brk(unsigned long, unsigned long); 1419 1420 1420 1421 /* truncate.c */ 1421 1422 extern void truncate_inode_pages(struct address_space *, loff_t);
+14 -2
mm/mmap.c
··· 240 240 return next; 241 241 } 242 242 243 + static unsigned long do_brk(unsigned long addr, unsigned long len); 244 + 243 245 SYSCALL_DEFINE1(brk, unsigned long, brk) 244 246 { 245 247 unsigned long rlim, retval; ··· 2138 2136 * anonymous maps. eventually we may be able to do some 2139 2137 * brk-specific accounting here. 2140 2138 */ 2141 - unsigned long do_brk(unsigned long addr, unsigned long len) 2139 + static unsigned long do_brk(unsigned long addr, unsigned long len) 2142 2140 { 2143 2141 struct mm_struct * mm = current->mm; 2144 2142 struct vm_area_struct * vma, * prev; ··· 2234 2232 return addr; 2235 2233 } 2236 2234 2237 - EXPORT_SYMBOL(do_brk); 2235 + unsigned long vm_brk(unsigned long addr, unsigned long len) 2236 + { 2237 + struct mm_struct *mm = current->mm; 2238 + unsigned long ret; 2239 + 2240 + down_write(&mm->mmap_sem); 2241 + ret = do_brk(addr, len); 2242 + up_write(&mm->mmap_sem); 2243 + return ret; 2244 + } 2245 + EXPORT_SYMBOL(vm_brk); 2238 2246 2239 2247 /* Release all mmaps. */ 2240 2248 void exit_mmap(struct mm_struct *mm)
+1 -1
mm/nommu.c
··· 1744 1744 kleave(""); 1745 1745 } 1746 1746 1747 - unsigned long do_brk(unsigned long addr, unsigned long len) 1747 + unsigned long vm_brk(unsigned long addr, unsigned long len) 1748 1748 { 1749 1749 return -ENOMEM; 1750 1750 }