comparison src/os/linux/vm/os_linux.cpp @ 656:6bdd6923ba16

6541756: Reduce executable C-heap Summary: Add executable parameters to reserve_memory and commit_memory to reduce executable memory to only the Code Heap. Reviewed-by: xlu, kvn, acorn
author coleenp
date Wed, 25 Mar 2009 14:19:20 -0400
parents bd441136a5ce
children 956304450e80
comparison
equal deleted inserted replaced
655:60bfce711da4 656:6bdd6923ba16
2267 2267
2268 // NOTE: Linux kernel does not really reserve the pages for us. 2268 // NOTE: Linux kernel does not really reserve the pages for us.
2269 // All it does is to check if there are enough free pages 2269 // All it does is to check if there are enough free pages
2270 // left at the time of mmap(). This could be a potential 2270 // left at the time of mmap(). This could be a potential
2271 // problem. 2271 // problem.
2272 bool os::commit_memory(char* addr, size_t size) { 2272 bool os::commit_memory(char* addr, size_t size, bool exec) {
2273 uintptr_t res = (uintptr_t) ::mmap(addr, size, 2273 int prot = exec ? PROT_READ|PROT_WRITE|PROT_EXEC : PROT_READ|PROT_WRITE;
2274 PROT_READ|PROT_WRITE|PROT_EXEC, 2274 uintptr_t res = (uintptr_t) ::mmap(addr, size, prot,
2275 MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0); 2275 MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0);
2276 return res != (uintptr_t) MAP_FAILED; 2276 return res != (uintptr_t) MAP_FAILED;
2277 } 2277 }
2278 2278
2279 bool os::commit_memory(char* addr, size_t size, size_t alignment_hint) { 2279 bool os::commit_memory(char* addr, size_t size, size_t alignment_hint,
2280 return commit_memory(addr, size); 2280 bool exec) {
2281 return commit_memory(addr, size, exec);
2281 } 2282 }
2282 2283
2283 void os::realign_memory(char *addr, size_t bytes, size_t alignment_hint) { } 2284 void os::realign_memory(char *addr, size_t bytes, size_t alignment_hint) { }
2284 2285
2285 void os::free_memory(char *addr, size_t bytes) { 2286 void os::free_memory(char *addr, size_t bytes) {
2415 os::Linux::numa_tonode_memory_func_t os::Linux::_numa_tonode_memory; 2416 os::Linux::numa_tonode_memory_func_t os::Linux::_numa_tonode_memory;
2416 os::Linux::numa_interleave_memory_func_t os::Linux::_numa_interleave_memory; 2417 os::Linux::numa_interleave_memory_func_t os::Linux::_numa_interleave_memory;
2417 unsigned long* os::Linux::_numa_all_nodes; 2418 unsigned long* os::Linux::_numa_all_nodes;
2418 2419
2419 bool os::uncommit_memory(char* addr, size_t size) { 2420 bool os::uncommit_memory(char* addr, size_t size) {
2420 return ::mmap(addr, size, 2421 return ::mmap(addr, size, PROT_NONE,
2421 PROT_READ|PROT_WRITE|PROT_EXEC,
2422 MAP_PRIVATE|MAP_FIXED|MAP_NORESERVE|MAP_ANONYMOUS, -1, 0) 2422 MAP_PRIVATE|MAP_FIXED|MAP_NORESERVE|MAP_ANONYMOUS, -1, 0)
2423 != MAP_FAILED; 2423 != MAP_FAILED;
2424 } 2424 }
2425 2425
2426 static address _highest_vm_reserved_address = NULL; 2426 static address _highest_vm_reserved_address = NULL;
2439 if (fixed) { 2439 if (fixed) {
2440 assert((uintptr_t)requested_addr % os::Linux::page_size() == 0, "unaligned address"); 2440 assert((uintptr_t)requested_addr % os::Linux::page_size() == 0, "unaligned address");
2441 flags |= MAP_FIXED; 2441 flags |= MAP_FIXED;
2442 } 2442 }
2443 2443
2444 addr = (char*)::mmap(requested_addr, bytes, PROT_READ|PROT_WRITE|PROT_EXEC, 2444 // Map uncommitted pages PROT_READ and PROT_WRITE, change access
2445 // to PROT_EXEC if executable when we commit the page.
2446 addr = (char*)::mmap(requested_addr, bytes, PROT_READ|PROT_WRITE,
2445 flags, -1, 0); 2447 flags, -1, 0);
2446 2448
2447 if (addr != MAP_FAILED) { 2449 if (addr != MAP_FAILED) {
2448 // anon_mmap() should only get called during VM initialization, 2450 // anon_mmap() should only get called during VM initialization,
2449 // don't need lock (actually we can skip locking even it can be called 2451 // don't need lock (actually we can skip locking even it can be called
2580 2582
2581 #ifndef SHM_HUGETLB 2583 #ifndef SHM_HUGETLB
2582 #define SHM_HUGETLB 04000 2584 #define SHM_HUGETLB 04000
2583 #endif 2585 #endif
2584 2586
2585 char* os::reserve_memory_special(size_t bytes, char* req_addr) { 2587 char* os::reserve_memory_special(size_t bytes, char* req_addr, bool exec) {
2588 // "exec" is passed in but not used. Creating the shared image for
2589 // the code cache doesn't have an SHM_X executable permission to check.
2586 assert(UseLargePages, "only for large pages"); 2590 assert(UseLargePages, "only for large pages");
2587 2591
2588 key_t key = IPC_PRIVATE; 2592 key_t key = IPC_PRIVATE;
2589 char *addr; 2593 char *addr;
2590 2594